このブログはGoogle Colabで見てください。
↓のアイコンをクリック
#@title
%%html
<marquee style='width: 60%; color: white;'><b>Welcome to OoH!Py</b></marquee>
ダークモードになっていなかったら,右上の歯車アイコンをクリックして「モード」を「dark」にすると
ダークモードに変わります。
このNotebook(ノートブック,以下note・ノートといいます)は小学生のみんながPython(パイソン)で
遊ぶためのものです。
僕らが遊んだ記録でもあります。
算数で遊びながらPythonを楽しんでください。
\ 勉強やスポーツと同じで,自分でやってみることが何よりも大切。
(「体で覚える」っていうやつ?)
\ Text Cell(テキストセル)に書いてあるprogramプログラムを見るだけじゃなくて,
新しいCodeCellコードセルに自分でプログラムコードpogram codeをマネして書いて,
動かしたり,数を変えたりしてテキトーに遊んでみて下さい。
\ コピペしたコードはエラーerrorになることが多いと思います。
コードは日本語は全角でOKですが,英字や記号は必ず半角で書いてください。
特に( )を全角で書いてエラーになることが多かったです。
\ 学校の”お勉強”と違ってPythonは”教わる”ものではなくて自分でやるものです。
だから楽しいし身につきます(それを体感できました)。
\ 書いてあるCodeコードは1つの例ですので,Code作成に慣れてきたらもっとよいCodeを考えて下さい。
\ 問題はやさしい順にはなっていないので,
むずかしい問題などがあったらとばしてさっさと先にすすみましょう。
\ よく整理できていないので,同じ問題や計算がありますけど気にしな~いで。
「しおり」をつけたいときはテキストセルで#しおりとすれば,目次にあらわれます。
先頭に#(シャープ,ハッシュ)をつけて下さい。
\ 整理していない結果,<目次>は十分ではないです。
ノート内で検索したいときは,PCのF3を押すと,右上に検索のための入力窓が出てきますので
それで検索してみて下さい。
\ これからは中学受験で忙しくなるので,記事の追加や変更などは下級生にバトンタッチします(2022年6月)
\ 英語バージョン
OoH!Py Python for Kids Vol.1 --->
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
このノートはGoogle Colaboratory(コラボラトリー・共同実験室)といいます。
(略してGoogleColab : グーグルコラボ)
\
以下に書いた手順で,このnoteの自分用のCopyコピーを作成して,
GoogleDriveグーグルドライブに保存します。
ブラウザはGoogleChrome(グーグルクローム)を使いましょう。
\ まずGoogleDriveをつくりましょう(★下記)。
Copyするには,上のメニューの「ファイル」クリック→「ドライブにコピーを保存」クリック。
自動的に新しいColabコピーが作成されます。
そうすると自分で作成したプログラム(コード)なども保存できます。
自動的に保存されますが,「ファイル」→「保存」でもできます。
一度自分用を作ったらあとは「保存」で上書き保存されます。
\ (★) Googleドライブを作るには,GoogleAccount(グーグルアカウント)が必要ですが,
Googleアカウントやドライブの作り方は無料で簡単なので自分で調べて下さい。
GoogleColab(グーグルコラボ)の使い方を簡単に以下で説明
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
その前にGoogleColabの紹介サイトの紹介
「データサイエンス」だとか「機械学習」だとか,内容はけっこう難しい。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
\ 左側に▶がついた枠(わく)をコードセル ( Code Cell )といいます
(上の英単語のように発音が知りたいときはその文字をクリックして
→Google翻訳でスピーカアイコンをクリック)
\ Linkリンクしてない単語がほとんどだけど,自分で調べて意味や発音を調べると英語の勉強にもなります。
問題や説明が書いてあるセル( text テキストという)
の下のCode Cellにcode(コード=プログラムをかいた文字・数字)をかいて
先頭の▶をクリックするとプログラムが動くしくみです。
\ Code CellやText Cellテキストセルがないときはcursorカーソルをcellとcellの間に持ってくると
「+コード +テキスト」が出てくるので選択
あとは自分で動かしてみれば自然と身につきます。
\ このノートの目次は左SideBarサイドバーの一番上のIconアイコン(横三本線)をClickクリック。
ノート内の検索は,メニューバーの「表示」で「セクションを展開」クリックしてから
PCの「F3」を押すと右上あたりに入力窓が出てきます。
Python入門のサイトはたくさんあるので,ここに書いたのはあくまで参考です
Colabを使ってPythonの基本が学べるのでおすすめです。
これからコードセルに自分でコードを書いて実行▶すると,エラーがよく発生すると思いますが
エラーについては,エラーが出たときにでもこのサイトを見てみましょう
Colabの説明とPython学習ができるサイトですが,かなりくわしいので
分からないときの参考書とするのがよいのでは
サイトの中の
をクリックするとColabのページになります
ご存知のように,数値
これは,円の円周とその直径の比率でした。
\ ほぼ3.14159に等しいですが,9の後もずーっと数が続く
無理数(むりすう/Irrational number)という数です。
これは分数として正確に表現することはできません。
\ Pythonは,小数点以下を計算して表示してくれます。
\ 下のコードセルの左側にあるプレイボタン
\ 何かテキストが表示されたら,見てみたい小数点以下の桁数を入力して
Enterキーを押します。
入力(input/インプット)は半角でお願いします。
小数点第10位くらいから増やしていくと面白いかも。
#@title
import sympy
pi_input = int(input('円周率を小数第何位まで見たい?>'))
pi = sympy.pi.evalf(pi_input)
print("円周率は,約", pi)
今の時間を知りたい?
下のコードセルの左側にあるプレイボタン
#@title
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
2022-06-18 02:36:32.716937
123を100回かけると何ケタの数になる?
#@title
n = 123**100
print(str(len(str(n))) + "ケタ")
#print(str(len(n)) + "桁")
1から200までかけるといくつになる?
Click ▶ in the left gutter of the code cell.
#@title
p=1
for a in range(1,201):
p=p*a
print(p)
あなたの誕生日は何曜日でしょう?
コードセルの
#@title
week = ['日曜日','月曜日','火曜日','水曜日','木曜日','金曜日','土曜日']
year,month,day = (int(x) for x in input('生年月日を半角で,西暦年 月 日で入力(スペースも半角)>').split())
print('あなたの生年月日は',year,'年',month,'月',day,'日ですね。',sep='')
weekday = (year + (year//4)-(year//100)+(year//400)+((13*month+8)//5) +day) %7
if month ==1 or month ==2:
year -=1
month += 12
print('あなたの誕生日は',week[weekday],'です。',sep='')
好きなところから始めて,適当に進んでね! 遊びなんだから
コードセルCode Cellにコードcodeを書く(入力する / input )とPythonが計算してくれます
\ 計算(calculation)の記号を演算子(operator オペレータ)といいます
演算子は,足し算( addition / add )は+ で,引き算( subtraction / subtract ) は - で,
これは算数と同じですが,
かけ算( multiplication / multiply )は * で,割り算( division / divide )は / を使います
計算の優先順序(プライオリティ priority )は算数と同じで,
括弧/かっこ(bracket ブラケット)は先に計算します
同じ数を2回掛けるときは**を使います
5 * 5は5**2,5 * 5 * 5は5**2と書きます
下のコードセルに書いて(入力して)実行▶
#このセルを実行して計算します
#5を2回かける(5 $\times$ 5 ということ)
5 ** 2
#5を3回かける(5 $\times$ 5 $\times$ 5 ということ)
5 ** 3
★算術演算子(さんじゅつえんざんし)
加減乗除などをおこなう
算術演算子(Arithmetic operator アリスメティック オペレータ)
と呼ばれる記号があります
\
| 演算 | 記号 |
|---|---|
| 足し算 | + |
| 引き算 | - |
| かけ算 | * |
| 割り算 | / |
| べき乗 | ** |
\
「べき乗」→後で出てくるので覚えておいた方がいい
「同じ数をかける」という演算
テキストセル(Text Cell)ではMarkdown(マークダウン)という書き方を利用しています
問題の中でも説明している場所もあります
ここに出ているサイトもご参考まで
(Colab用) Markdownの使い方
Qiita MarkDown記法【初心者によるまとめ】
Markdown Guide (English / GoogleColab)
★Colabで計算してみよう!
Colabで計算できるケタ数の違いがわかる
Q?
電卓でこの計算をしてみたかった?
123456789
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Pythonでは,かけ算は*を使う(半角)
* を表示させるには → Shiftキーを押しながら*キー
\ 123456789 * 123456789
123456789*123456789 と書いてもいいですが,
数や記号の間を少し(半角のスペース)開けるとちょっと見やすいです。
123456789 * 123456789
3回かけよう
\ Q?
123456789
** (べき乗の記号)上にも書きましたが,Pythonでは同じ数を2回かけるとき,
123456789**2(123456789の2乗(二じょう))(じじょう,にじょう)
3回かけるときは,123456789**3と書きます(123456789の3乗(さんじょう))
\ 2乗,3乗,4乗,・・・をあわせて「べき乗」とか「累乗(るいじょう)」
123456789**2
Q?
1234
Q?
9999999
さらにちなみに数学では,同じ数をかけるときは
1234567892,1234567893などと右肩に小さめに書きます
\ この書き方の方が簡単なので今のうちに覚えておく
プラス+ を表示させるには → Shiftキーを押しながら+キー
足し算の練習も,もうすぐ出てくる
Q?\ 989394122+102437282=?
2乗や3乗などを書くときに算術演算子で出てきた**を使います
上のコードは
98939412 * 98939412 + 10243728 * 10243728
でもいいですが,大変なので
9839412 **2 + 10243728 **2
だとラクです
Q?
26824404+153656394+187967604=?
2682440 * 2682440 * 2682440 * 2682440 + 15365639 * ・・・・・・
だとすごく長くなって大変です
2682440 **4 + 15365639 **4 + 18796760 **4
だとラクです
(この計算の答えを下の式の答えと比べてみよう)
Q?
上の式の答えと比べると
206156734=?
同じになることを確認できました?
Q?\ 「折り紙を何回折れば太陽に届く厚さになるか?」の問題を考えます
折り紙の厚さ=0.1mm(ミリメートル)とすると,とすると,
=0.0001m(メートル)
=0.0000001km(キロメートル) だから,
\ 何回折ったら紙の厚さが,
太陽までの距離=149,600,000km
に近づくか?
\ 1回折ると厚さは,0.0000001 0.0000001 * 2
2回折ると,0.0000001 0.0000001 * 2 * 2
\ 5回折ると,0.0000001 0.000001 * 2 * 2 * 2 * 2 * 2
→面倒だから0.0000001 * 2 **5 2回折ることを5回繰り返す=「$\times$2」の5乗
\ 10回折ると,0.0000001 0.0000001 * (2 **10)(カッコはなくてもOK)
30回折ると,0.0000001 * (2 **30)
40回折ると,0.0000001 * (2 **40)
もうちょっとかな?
0.0000001 * (2 **41)
と1ずつ増やしていく
何回になるか自分で確認
#41回折ると・・・・
0.0000001 * (2 **41)
219902.3255552
0.0000001 * (2 **42)
439804.6511104
これは,約439,804km
太陽までは,149,600,000kmだから,まだまだっぽい
#50回では?
0.0000001 * (2 **50)
112589990.6842624
Q?
163+503+333=?
これをプログラムで書くと
16**3 + 50**3 + 33**3
Q?
0を0回かけるといくつ? 「0の0乗(じょう)」はいくつ?
\ 0**0
+ (足し算)★足し算(addition)をやってみよう
\ プラス+ を表示させるには → Shiftキーと+キー
Q?
16 + 7 + 8 をPythonで計算するにはCode Cellにどう書けばいいか
<解答>
16 + 7 + 8
この式も立派なプログラムです。
\ <注意>
➀ 16 + 7 + 8 = とequalイコール=を入れないこと
② 16+7+8 のように数字や記号の間にスペースspace(空白)を入れなくても同じですが,
スペースを入れると見やすくなるので,ふだんから入れるようにしましょう
#)#上と同じようにインプットしてみる
Q?
3163 + 3613 =?
- (引き算)Q?
54 - 6 - 9 は?
引く-を表示させるには,0キーの右となりの - キー
/ (割り算)割り算は/ 演算子を使う
Q?
956956 ÷ 7 ÷ 11 ÷ 13 = ?
かき方
956956 / 7 / 11 / 13
Q?\ 894894 ÷ 7 ÷ 11 ÷ 13 =?
* (かけ算)Q?
4
\ かけ算は * を使う
\ 4 * 7 * 2
Q?\ 239
Q?\ 7373
Q?\ 18 ÷ 3 ÷ 2
結果は 3.0 と出るが,3 と同じ
Q?\ 345 + 65
Q?\ 355 ÷ 113
小数第6位まで円周率と同じになった!
Q?\ 856
Q?\ 21978
#商の数の並びに注目
Q?\ 682
かけ算を2つ書いても最後の式だけのアウトプット(出力/表示)になる
682 * 18
716 * 84
2つの式の両方ともoutput(アウトプット)が見たいときは
printプログラム(プリント/印刷という意味)を使う
print()はかっこの中の数や計算結果をoutputするプログラム
printの練習は後でまた
\ 次の3つの式や数をアウトプットするときのコード
\ print(682 * 18)
print(716*84)
print(1192)
Q?
1 + 4 + 6 + 7 = ?
2 + 3 + 5 + 8 = ?
1
2
\ 式が4つあるのでprint()を使って
print(1 + 4 + 6 + 7)
print(1 * 1 + 4 * 4 + 6 * 6 + 7 * 7)
などとインプットしていく
Q?
(6
Q?\ 438 + 9
Q?\ (37 + 28)
Q?
96 ÷ 8
30 - 27 ÷ 3 + 6
print(96 / 8 * 6 / 3)\ print(30 - 27 / 3 + 6 * 7)
Q?
33 - (9
print(33 - (9 * 8 - 2) / (11 - 2 * 3))
(注意)print{33 - (9 * 8 - 2) / (11 - 2 * 3)}と,中かっこ{ }は使わないこと
Q?\ 6.5
0で割ろうとするとエラーErrorになる
\ 35 / 0
print()についての使い方の説明がいろいろ出てきますが,ここで覚える必要はなく
これからたくさんいろいろ使いますので,自然に覚えられますからご心配なく
\ 説明している知識については,読み流す程度で十分です
使うときに分からければ戻ってくればいい話です
どの説明についても同じです
Q?\ 次の計算をしなさい\ \ 15873 print(15873 * 7, 15873 * 14, 15873 * 21, 15873 * 28, 15873 * 35, 15873 * 42, 15873 * 49, 15873 * 56, 15873 * 63)
積を改行してprintしたいときは,\ \ print(15873 7)\ print(15873 14)\ …\ print(15873 *63)\ と書くか,
print(15873 * 7)
print(15873 * 14)
#つづきは自分でinput
または
一行で書いて,最後に sep = "\n" と書く
print(15873 * 7, 15873 * 14, 15873 * 21, 15873 * 28, 15873 * 35, 15873 * 42, 15873 * 49, 15873 * 56, 15873 * 63, sep = "\n")
改行しないでカンマ,で区切りたいとき,
最後に sep = "," をつける
sep = ", " とするとすき間(スペース space)ができる
Q?
1 ÷ 891
1 ÷ 8991
\ 2つの商を出力するので,printを使って
print(1 / 891)
print(1 / 8991)
または
print(1 / 891, 1 / 8991) 一行,カンマなし,スペースあり
または
print(1 / 891, 1 / 8991, sep = "\n") 改行
または
print(1/891, 1/8991, sep = ",") 一行,カンマあり,スペースなし
または
print(1/891, 1/8991, sep = ", ") 一行,カンマあり,スペースあり
Q?
39
3
\ 答をカンマで区切って並べて表示
print(39 * 75, 3 * 375, sep = ", ")
Q?\ 10
print( )を使って,逆に改行しない
最後に end = "" をつける
end = " " とするとすき間(余白,スペース)ができる
Q?
37
37
\ print(37 * 3, end = " ")
print(37 * 3 * 1001)
「文字の並び」のことを文字列といいますが,
print()のなかで," "や' 'で囲まれた数字や計算記号も文字列となって,
" "や' 'の中に数や式があっても計算されずにそのまま出力されます
\ " "(チョン2つ)をダブルクォーテーション / Double quotation (2キーの上側)
' '(チョン1つ) をシングルクオーテーション / Single quotation (7キーの上側)
下のコードセルを実行▶して結果確認
print("12 + 30")
print(12 + 30)
print()
print('28 - 15')
print(28 - 15)
print()
print("38 x 45")
print(38 * 45)
print()
print("10 ÷ 3")
print(10 / 3)
print()
print('22 ÷ 3 商は整数')
print(22 // 3)
print()
print("22 ÷ 3の余り")
print(22 % 3)
12 + 30 42 28 - 15 13 38 x 45 1710 10 ÷ 3 3.3333333333333335 22 ÷ 3 商は整数 7 22 ÷ 3の余り 1
上のセルでprint()が間に入っていますが,これを入れると,なにも出力されず改行になります
★print( )で文字の表示outputアウトプット
数字と同じで,文字を書いて▶で実行するとそのままoutputされる。
ただし,inputでは,数字と違って文字を
" " (double quotation )
か
' ' (single quotation)
でくくる
Q?
こんにちは
と表示させるには
\ "こんにちは"で実行▶すると,'こんにちは'と表示され,
print("こんにちは")だと,こんにちはと表示されます
Q?\ こんにちは Python\ と表示\ \ 'こんにちは ' "Python"
★文字をくっつける\ \ Q?\ こんにちはPython\ と表示\ \ "こんにちは" + "Python"
Q?\ こんにちは こんにちは こんにちは こんにちは こんにちは\ と5個続けて並べる\ \ "こんにちは こんにちは こんにちは こんにちは こんにちは"\ でもいいけど,\ "こんにちは " * 5
Q?\ printを使って\ hellow world 世界の皆さん こんにちは\ と表示\ \ print("hellow world 世界の皆さん こんにちは")\ print("hellow world","世界の皆さん","こんにちは")
★文字と数字をいっしょに出力\ \ Q?\ 1 + 1 は2になります\ と表示\ \ 全部文字としてprint\ print("1 + 1は2になります")
文字と数字を区別する
この方法をよく使うかも
\ 文字や記号は" "や' 'で囲み,数字はそのままで,間は , (カンマcomma)で区切る
print(1, "+", 1, "は", 2, "になります")
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
式を入れると,文字列にしなければ,式を計算した結果が出力されます
\ 'print(1 + 1, "は", 2, "になります")`
または,次の方法がある(めんどうだけど,この方法は覚えておいたほうがいいかも)
\ print(str(1) + "+" + str(1) + "は" + str(2) + "になります")
\ 全部文字にそろえないとprint出力できないので,
そのために数字を文字あつかいに変える
文字と足し算の記号+は,文字と同じく" "か' 'でくくり,
数字はstr()の中に入れる
\ str = strings (文字列)の略で,これで数字を文字に変える
文字をくっつけるために+記号を使う
\ 文字列とは,文字を並べたもの
数など他のデータと区別して,文字の並びを表すデータを文字列という。
print(str(1+1) + ”は” + str(2) + "になります")\ とすると,
逆に,\ print(str(1) + "+" + str(1) + "は" + str(1+1) + "になります")\ とすると,
「1+1=2 です」とするには,\ 全部文字にすると,\ print("1+1=2です")
str()を使うと,\ print(str(1) + "+" + str(1) + "=" + str(2) + "です")
組み込み関数print()をもう少し
print()はよくprint関数といいます
これから出てくる input(), int(), float()なども全部関数で,
組み込み関数(くみこみかんすう) (built-in function・ビルト-イン ファンクション)といいます
文字通りPythonに組み込まれている関数なんです
全部で69個あるそうです→Qiita python 組み込み関数を69個全て紹介
関数=「何かの処理をするプログラムのひとまとまり」とでも覚えておいてください
\ たとえばprint()は実は何十行からなるプログラムなので,使うつどそのコードを書いてたら死んでしまいます
それを関数にするとprint()だけのコードでOKになります
もちろん()の中に何か入れますが
printのコードは「Mercurial>cpython」 の1580行(builtin_print(PyObject self, PyObject args, PyObject *kwds))からみたいです
\ 関数に関してははまた後ででてきます
Q?
このコードを実行した結果はどうなる?
a = 1 + 2
print(a)
b = a + 3
print(b)
a = a + 5
#a += 5
print(a)#コードを書いて確認
= (代入記号)①★変数(へんすう)について
\ 変数をよく使います
上の問題に出てきたaやbのように
数(データ)などを入れるための文字(aとかbとかnumber(ナンバー)などの単語)のことです
\ なぜ数をわざわざ文字に入れるのかは,使っているうちに分かります
あとで"変数の練習"で確認
\ aという変数に3を入れることを,「(変数)aに3を代入する」といい,そのコードは
a = 3
=は算数では「等しい」を表しますが,
Pythonでは代入演算子(だいにゅうえんざんし)といって
「右側の3を左側のaに入れる」を意味します
=は,←と覚えておく
\ 代入演算子(だいにゅうえんざんし)はまたでてきます
\ 次のコードを書いて実行
a = 3
a
aと書かずにprint(a)と書く方が多いです\ 結果は同じですが
こんどは,
「x(という変数)に10を代入し,
次にxに5を足した数をy(という変数)に代入し,
そのyをprint()で出力(output)する」
というプログラムをつくると
x = 10
y = x + 5
print(y)
となります
\ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
下のコードセルの中で,白くなったところだけがコードです
''' ''' (コメント)'''「x(という変数)に10を代入し,
次にxに5を足した数をy(という変数)に代入し,
そのyをprint()で出力(output)する」
というプログラムをつくる'''
#上のように'''(3つのsingle quartation mark:シングル クォーテンション マーク)
#で囲まれた文章や,この説明文のように先頭に#(sharpシャープとかhashハッシュ)がついた文は
#コメント文(comment statement)といってprogramプログラムの中に
#書かれていてもprogramではない
#コードに#をつけると,そのコードは実行されません
#コードに#をつけることを,comment out・コメント アウト といいます
x = 10
y = x+5
#y = x - 8 #このコードは無視される
print(y) #この行は y だけでもよい
15
m = 5
n = 7
a = m + n
print(a)
というコードを入れて実行▶
mに5,nに7が入っているから,a = m + nの式で
a = 5 + 7 = 12 になります (ここの=は等号・イコールです)
print()の練習の続きですが
pという変数に数字の57を入れ,qという変数に数字の30を入れて
「57と30の和は87」と表示させるコードは
\ p = 57 q = 30
print("「" + str(p) + "と" + str(q) + "の和は" + str(p+q) + "」")
★長い文(データ)を分けて表示するには'''で囲む
(ちょんちょんちょん)シングルクォーテーションマーク3つ(Shift + 7キー)
<完成例>
老夫婦に助けられた鶴の化身である娘に,ある日
「布を織りたいので糸を買ってきて欲しい」と頼まれました。
老爺が糸を買って来ると,
娘は「絶対に中を覗かないで下さい」と夫婦に約束を言い渡して部屋にこもり,
三日三晩不眠不休で布を一反織りました。
入力方法
変数には文字・文章も入れることができます
上に書いた長い文章を,story変数に代入して
\ story = '''老夫婦に助けられた鶴の化身である娘に,ある日
「布を織りたいので糸を買ってきて欲しい」と頼まれました。
老爺が糸を買って来ると,
娘は「絶対に中を覗かないで下さい」と夫婦に約束を言い渡して部屋にこもり,
三日三晩不眠不休で布を一反織りました。
'''
print(story)
// % (割り算)計算練習に戻ります
★割り算の整数の商だけ求める(切り捨て)
\ 21 // 5
\ 整数の商だけ求めるには//演算子を使う
21 / 5 だと答えはどうなるかも確認
21 // 5
21 / 5
Q?
次の割り算の商を求めなさい
10 ÷ 3
276 ÷ 13
#式が2つあるからprint()を使って
★割り算の余りだけを求める
\ 余りだけ求めるには%演算子を使う
12 % 5
\ // も %も意外とよく使う
\
計算記号(+, -, *, **, //, %など)を「演算子(えんざんし)」と呼ぶ
Q?
次の割り算をしたときの余りを求めなさい
276 ÷ 13
587 ÷ 28
263487 ÷ 237
#3つ式があるからprint()を使おう
print(276 % 13)
Q?\ 12 ÷ 5 のあまりは 2 です。
と表示する
\ print('12 ÷ 5 のあまりは' , 12%5 , 'です。')
\ 文字をprintするときは' 'か" "でかこむ
文字を含むprintのときは,数や計算との間は,(カンマ)で区切る
\ または
print('12 ÷ 5 のあまりは ' + str(12%5) + ' です。')
文字をprintするときは' 'か" "でかこむ → ここは上と同じ
文字を含むprintのときは,数や計算を文字として読みかえるstr()プログラムを使い,
文字とstr()は+で結ぶ
\ または
全部文字あつかいにして
print("12 ÷ 5 のあまりは2です。")
★算術演算子(さんじゅつえんざんし)まとめ
| 演算 | 記号 |
|---|---|
| 足し算 | + |
| 引き算 | - |
| かけ算 | * |
| 割り算 | / |
| べき乗 | ** |
| 割り算(商だけ) | // |
| 割り算(余りだけ) | % |
= (代入記号)②また変数です
5をnという変数(文字)に入れて(代入・だいにゅう),printするプログラムは, n = 5
print(n)
n = 5
n
でもよいが,print(n)の方がプログラムを見る人が分かりやすい
「=」は算数のイコールではなく「入れる(代入する)」という記号
\ 5 = nは絶対ダメ,「5をnに代入」は,n = 5(= は ←と覚えておく)
あとで,==という記号(演算子)が出てくるが,これが算数の=と同じ
=は,←で,
==は,= と覚えておく
Q?
「7をnumberという変数に代入してprintし
続けて34をnumberに代入してprintし
続けて"数"という文字をnumberに代入してprintするプログラム」
\ はどうなるか
これでnumberを変数と呼ぶ意味がなんとなくつかめますか?
\ 変数には数だけでなく文字も代入できる
数や文字など変数に入れるものをまとめて
「data(データ)」とか「値(あたい),value(バリュー)」と呼ぶことも
\ number = 7
print(number)
number = 34
print(number)
number = "数" #文字は" "か' 'で囲む
print(number)
文字列を変数に代入してprintで出力するサンプルです
こんな使い方もあるんだとながめておいて下さい
#'Hello'という文字列と`World`という文字列を'+'記号でつなげられます
print('Hello' + 'World')
#nameという変数に'Alice'を代入し,変数を使って文字列をつなげる
name = 'Alice'
print('My name is ' + name)
#print()のカッコの中を文字列とする場合は,ageの中身が数字なので,str()で文字にかえてからつなげる
age = 24
print('My name is ' + name + 'My age is ' + str(age))
#逆に文字列を数に変換するにはint()を使う
#2つの値段を文字列と数で表し,その和(sum)を計算するには,文字列をint()に入れて整数に直してから計算
price1 = '1000'
price2 = 500
sum = int(price1) + price2
print(sum, '円')
printの説明のところで
関数=「何かの処理をするプログラムのひとまとまり」と説明しましたが
関数のイメージは,「仕組み」,「ロボット」とかと考えればよいと思います
print()も関数でした
( )の中に'おめでとう'と入れて実行▶すると, おめでとう と表示(出力)される「仕組み」
print('おめでとう')
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
関数名( )の( )に文字や数や変数などのデータを入れると答えてくれる「ロボット」
例えば,( )に数を入れると,それに1をたした数を答える(返すといいます)関数をつくってみます
関数名は自分で決めますが,人が見ても分かりやすい名前がいいと言われてます
\ 関数名=add_1(addアッド=足すの英語,名詞はadditionアディション)とします
\ 関数をつくるときははじめに,defと書きます
関数をつくるとき,「関数を定義する」というので,defは英語の定義definition(デフィニション)の頭3文字
まずは下のセルで,このコードを書いて,実行▶
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー \ !!コードの注意点!!
関数名()のあとに:(コロン)をつけることと,次の行からはdef add_1(x) :より下げる(字下げ=インデント)
★★:をつけてEnterすると,自動的に字下げ(インデント)されます★★
どこまでが関数のコードかは,字下げ(インデント)で決まります
こんなに短い関数では関係ないですが,長い関数になると注意が必要
def add_1(x) :
return x + 1
add_1(10)
def add_1(x) :の( )の中の文字(ここではx)を引数(ひきすう)といいます
def add_1(x) :
return x + 1
#上でつくった関数「add_1」を動かすには,xに数をいれるだけ
add_1(10)
11 と出力(表示)されましたね
def add_1(x) :で関数を定義して,2行目以降で「仕組み」のコードを書きます
「仕組み」は「xに入った数に1をたす」なのでx + 1
そのx + 1を,xに数を入れた人に「返す」ので,return (「返す」の英語)
add_1(x) :の変数xに10を入れると,10 ∔ 1を計算して11を返す「仕組み」です
\ この関数を動かす(=実行する)には,関数をかいて,引数xに数(データ)を入れて,実行▶
\ ちなみに,関数を実行することを「関数を呼びだす」といいます
\ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
数を入れると,その数を2倍して返す関数の例は,
def multi_2(n) :
return n * 2
これには引数(変数)nを使っています
変数の名前も自分で決めれます
変数名は,かけ算する=multiplyマルティプライの略 (かけ算=multiplication)
にしましたが,これも自分で決める
このコードを書いて,関数を動かしてみると,
#ここに自分で関数のコードを書いてから,何か数を入れて関数を呼びだしてみましょう。
#sample
def multi(n) :
return n * 2
multi(7)
関数をつくることは意外と簡単でした
四則計算の英語
| 動詞 | 名詞 | 答 | |
|---|---|---|---|
| 足し算(加算) | add, plus | addition | sum, summation |
| 引き算(減算) | subtract, minus | subtraction | difference |
| かけ算(乗算) | multiply | multiplication | product |
| 割り算(除算) | divide | division | quotient |
Q?
「12を□で割ったときのあまり」(つまり,「12を割ったあまり」)
を求める関数は?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<解答例>
あまり=remainder(リマインダー)なので関数名をRemain,引数をr
計算は,12÷r=(商)…(あまり)となるので,ここの(あまり)を表示させるための
コードは,算術演算子の%を使って,
def Remain(r) :
return 12 % r#で関数のコードを書いてから,何か数を入れて関数を呼びだしてみましょう。
#sample
def Remain(r) :
return 12 % r
Remain(9)
Q?
次のコードはどんな関数でしょうか?
def function(a, b) :
x = a + b
return x * x
関数をつくって,数字を入れて確認
function(ファンクション) = 関数の英語
#コードを書いてみましょう
def function(a, b) :
x = a + b
return x * x
function( 2, 5)
#この関数は
#「2つの数を入れると,その和を計算し,和を2回かける計算をしてreturn(返す)」
#という仕組み
# a = 2, b = 5 の場合
# x = a + b = 2 + 5 = 7
# 7 * 7 = 49
Q?
時速(km/時)を入れると秒速(m/秒)を返す関数で,
「時速□kmは,秒速△m」と表示させるには?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
関数の名前と引数名を決めて
処理は
時速を秒速に直し→(時速)
\ 返す(return)方法は,print()関数を使い
秒速が小数(浮動小数点)になるので,int()関数で整数に直して出力
#sample
def Jisoku_henkan(x) :
speed_second = x * 1000 / 60 / 60
return print('時速', x, 'kmは,', '秒速', int(speed_second), 'm')
Jisoku_henkan(100)
また変数です
変数を別の変数に代入できる
\ Q?
365をyear(イヤー)に入れて,
yearをtoday(トウデイ)にいれて,
todayをprint
\ year = 365
today = year
print(today)
#コードを書いてみましょう
Q?\ 200秒は何分何秒ですか?\ 分にして余りは秒になる\ \ print(200 // 60, '分', 200 % 60, "秒")
#コードを書いてみましょう
200 // 60や,200 % 60の計算結果を変数に入れる
minute = 分,ミニッツ
second = 秒,セコンド
時間は,hour(アワー)
timeも時間だが,時間,回数,期間などの意味で,hourは時間の単位を表す
\ minute = 200 // 60
second = 200 % 60
print(minute, '分', second, '秒')
Q?
23をxに入れて,35をyに入れて
x + y (足し算)の結果をzに入れて
x - y (引き算)の結果をwに入れて
x * y (かけ算)の結果をuに入れて
x / y (割り算)の結果をvに入れて
x**y (べき乗,累乗(るいじょう))の結果をtに入れて
z,u,v,tをそれぞれprint
\ x = 23; y = 35 ☜ 行を分けない(改行しない)ときの書き方(;(セミコロン)で区切る)
z = x + y
print("足し算の結果は,", z)
など
#コードを書いてみましょう
#sample
x = 23; y = 35
z = x + y
print('足し算の結果は,', z)
w = x - y
print('引き算の結果は,', w)
#同じように書いてみましょう。
Q?
関数の練習
2つの整数を入れる(大,小の順)と,足し算,引き算,かけ算,割り算の商と余りの4つの計算をして
式と答えが表示される関数をつくり,数を入れて関数を呼びだします。
これは難しいのでsampleだけ確認でもOK,コードをかけそうな人はチャレンジ。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
足し算の答え「和」は“summation” サァメェィション
引き算の答え「差」は“difference” ディファレンス
掛け算の答え「積」は“product” プロダクト
割り算の答え「商」は“quotient” クオシェント
そして
割り算の「余り」は“remainder” リメインダー
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
関数名と引数2つを決める
\ 四則計算して答を変数に入れる(英語は下の表で確認)
商とあまりは2つの式になる
print()関数に入れて返す
\ print文で,sep = ' 'とすると,出力ごとに改行される
sepはseperate(区切り,セパレイト) sep=','と書くとカンマが入って改行
#sample
def calculation(a, b) : #calculation=計算の英語
sum = a + b
difference = a - b
product = a * b
quotient = a // b
remainder = a % b #remainder=あまりの英語
return print(a, '+', b, '=', sum, sep = ' '), \
print(a, '-', b, '=', difference, sep = ' '), \
print(a, '$\times$', b, '=', product, sep = ' '), \
print(a, '+', b, '=', quotient, 'あまり', remainder)
calculation(5, 2)
四則計算の英語
| 動詞 | 名詞 | 答 | |
|---|---|---|---|
| 足し算(加算) | add, plus | addition | sum, summation |
| 引き算(減算) | subtract, minus | subtraction | difference |
| かけ算(乗算) | multiply | multiplication | product |
| 割り算(除算) | divide | division | quotient |
input()プログラム (input関数」といいます)の使い方
\ input()関数もprint()関数と同じ組み込み関数です。
\
次のプログラムを実行すると
'数字を入れてね' と表示されるので,半角で数字(整数)を入れてEnterキー
number = input("数字を入れてね:number =")
print("あなたが入れた数は", number, "ですね")
#コードを書いてみましょう
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
好きな数(整数)を入れてほしいときに使う
\ a = input("数字を入れてね:a =")
b = input("bはいくつにしますか:b =")
print('入れた数は,', a, 'と', b, "ですね")
print("a + b は,", int(a)+int(b), "です。")
\ input()プログラムでは,数を入力しても出力は文字になってしまいます。
上の例では計算はしないのでそのままで数がprintされるが,
足し算など計算するときは,aの中身を数に戻すためにprint()の中で
int()プログラムでa,bを整数に直す。
intはinteger(インテガー,整数)の略で,中に入っている文字に化けた数を整数に直す
#コードを書いてみましょう
#sample
a = input("数字を入れてね:a =")
b = input("bはいくつにしますか:b =")
print('入れた数は,', a, 'と', b, "ですね")
print("a + b は,", int(a)+int(b), "です。")
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
別の書き方
最初にinput()プログラムをint()プログラムにいれてしまう方法もあり
こうすると,inputで数を入れたときに,文字あつかいをint()で整数に直せる
\ a = int(input("数字を入れてね:a ="))
b = int(input("bはいくつにしますか:b ="))
print('入れた数は,', a, 'と', b, "ですね")
print("a + b は,", a+b, "です。")
#コードを書いてみましょう
Q?\ 時速(km/時)をinputすると秒速(m/秒)に直すプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
時間はhour(アワー),秒はsecond(セカンド)なので,
時速の変数をkm_h,秒速の変数をm_hと決めます
\ 変数の名前で使える記号は_(underscoreアンダースコア)だけです
日本語でアンダーバーといいますが,英語ではアンダースコア
変数名で使えるのは,
「大文字小文字のアルファベットと数字,アンダースコア」で,
「数字は先頭には使えない」
ということを覚えておけばOKだと思います
漢字なども使えるようですが,英文字でいきましょう。
\ 時速をinputしてもらい,それを小数点の変数に変えて,km_hに入れるコードは
km_h = float(input('時速を入力してください: ','km'))
\ float()は中の数を小数点単位の数に変えるプログラムです
前に出てきたint()は整数に変えるプログラムでした
ここでは秒速が小数になることがあるのでfloat()を使います
\ 入力された時速(km\時)を秒速(m/秒)に変えるには,
キョリの単位をkmからmに変えるために1000をかけて,
1時間は60
それを秒速の変数m_sに入れるコードは
m_s = km_h*1000/60**2
\ m_sをprintするコードは
print('時速', km_h, 'kmは,秒速', m_s, 'mです')
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
小数点以下第2位くらいまでの表示にしたいときは,
m_s =round(m_s,2)
としてからprintすると,小数第3位を四捨五入して表示されます
round()は中の数を四捨五入するプログラムです
m_s = round(m_s,2)は,
「変数m_sの中の数を小数第2位までの数にして,m_sに入れ直す」
という意味になります
\ まとめると,
km_h = float(input('時速(km)を入力してください: '))
m_s = km_h*1000/60**2
m_s =round(m_s,2)
print('時速', km_h, 'kmは,秒速', m_s, 'mです')
#上のコードをここに書いてみましょう
Q?
次のように表示させるには?
\ ' あなたのお名前を教えて下さい。'と表示させ,
名前を入れると,
'「xxxx」さんですね'と表示する。
\ これは数字が入らないので簡単
\ a = input("あなたのお名前を教えて下さい:")
print(a, 'さんですね')
\ aは変数ですので自分で好きな名前を決めて下さい。
日本語でもOKです。
文字(列)は," "(double quotation) か' ' (single quotation)
のどちらでくくっても大丈夫です。
#コードを書いてみましょう(自分で適当に変えてみては)
#sample
a = input("あなたのお名前を教えて下さい。:")
print(a, 'さんですね')
Q?\ 英語と算数のテストの点数を入力してもらい,入力された点数と\ 点数の合計と平均を計算して表示するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
変数を,英語(の点数)はenglish,算数はmath,合計はsum,平均はaverageとする
\ math(マス)=数学mathematics(マセマティックス)という英語の略
sum(サム)=合計,和という英語,total(トータル)と同じ
average(アベレジ)=平均という英語
\ 入力してもらい変数に代入するコードは,
english = int(input('英語の成績を入力して下さい: '))
math = int(input('算数の成績を入力して下さい: '))
\ 合計と平均を計算するコードは
sum = english + math
average = sum / 2
\ 表示するコードは
print('英語の点数:', english, '点')
print('算数の点数:', math, '点')
print('合 計:', sum, '点')
print('平 均:', average, '点')
#コードを書いてみましょう
Q?
200円持っています
自動販売機で飲み物を買ったときのおつりを計算します。
ジュースは,水が80円,コーラが120円,レモンジュースが180円です。
飲み物を買っておつりを計算するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
下が答えのコードです
\ 先ずはこのコードを書いて実行▶すると
<水は80円,コーラは120円,レモンジュースは180円>
と表示されて,
<どれにしますか>
と,きかれるので
水,コーラ,レモンジュースのどれかを文字入力してEnterすると
<お金を入れて下さい>
と言われるので,水だったら100,コーラかレモンジュースだったら200を入力してEnter
<おつりはxxx円です>
でおしまい
\ drink = {'水':80, 'コーラ':120, 'レモンジュース':180} #drinkドリンク=飲み物
print('水は80円,コーラは120円,レモンジュースは180円')
select = input('どれにしますか:') #selectセレクト=選択
x = int(input('お金を入れて下さい:'))
y = x - drink[select]
print('おつりは',y,'円です。')
\ ここで出てきたコードは次に説明します。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
このプログラムで,
drink = {'水':80, 'コーラ':120, 'レモンジュース':180}
というコードが出てきたので少し説明
これは”辞書”(dictionaryディクショナリ:短縮=dict)といって,キー(key)と値(valueバリュー)の
組み合わせを集めたもの
上の例で,「’水’がkeyで80がvalue」これで1セット
\ これを使うと,「どれにしますか」と聞かれて水と答えると,
計算が必要なときは,keyの水とセットになっているvalueの80で計算する
\ 水と80がselect変数に入り,y = x - drink[select] の計算式ではvalueの80が使われる
\ x = 100 とすると, y = x-80 = 100-80 = 20 だから,
「おつりは20円です。」となります
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「辞書」を詳しく知るには→ここで (Pythonプログラミング入門 3-1辞書)
上の説明の中で「辞書」が出てきましたので,ちょっと説明
辞書 = dictionary(ディクショナリ)
\ 数や文字などをまとめて,「データ」といいます
( 情報とも言うようですが,このノートではだいたいデータといます)
\ データはたいてい入れ物(箱)に入っていて,入れ物によって,データ型とよんでいます
このノートでよく出てくる型は,リストですが,辞書もふつうよく使われています
\ リストはデータを[ ](大かっこ)の箱に入れます
辞書はデータを{ }(中かっこ)の箱に入れます
[2, 6, 273, 38, "バナナ", "りんご"]はリスト型のデータ
上で出てきた{'水':80, 'コーラ':120, 'レモンジュース':180}は辞書型のデータ
\ リストの説明はあとで出てきます,ここでは辞書について簡単な説明です
\ 詳しい説明は → 辞書Colab
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
辞書型データでは,キーKeyとヴァリューValueが1セットになってデータが入っています
'辞書名 = {"Keyキー": "Value値", ・・・・・}`といった感じです
\ {'水':80, 'コーラ':120, 'レモンジュース':180}では,
'水','コーラ','レモンジュース'が,で,キーKey
80, 120, 180 が,ヴァリューValue
\ キーKeyとヴァリューValueの間に:(コロン)をつけて1セットになります
;(セミコロン)ではダメです
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
使い方をみていきます
次のセルを実行▶
dict1 = {"鉛筆":60, "消しゴム":130, "定規":210} #dict はdictionaryの頭3文字
print(dict1["鉛筆"])
辞書型データの箱の名前dict1のキーの1つの”鉛筆”を[ ]カッコで指定すると
”鉛筆”とペアになっている60が出力(表示)される仕組みです
どんな時に使うかは,後で出てくると思いますので,ここでは仕組みだけ
\ 次のセルを実行▶
dict1 = {"鉛筆":60, "消しゴム":130, "定規":210}
print("消しゴムの値段は", dict1["消しゴム"], "円")
この辞書型データでは,ヴァリューが整数(int)になっているので,print()で
文字列と数字の組み合わせで出力します
Q?
「こんにちは」と「さようなら」の文字列を変数に代入して,
printプログラム内でつなげて表示
\ 「こんにちは」を3回表示
\ 「こんにちは」に「さようなら」をつなげて表示
\ x ="こんにちは"
y = "さようなら"
print(x + y)
print(x * 3)
x += y
print(x)
\ 数のときと違い,"こんにちは" + "さようなら" は,文字の結合(つなげる)になることに注意\ "こんにちは" += "さようなら" でも同じ
Q?
文字の結合
\ 'こんにちは' + ' こんばんは'
Q?
変数を使って文字の結合
\ word1 = 'こんにちは'
word2 = ' こんばんは'
text1 = word1 + word2
print(text1)
"こんにちは " * 3
変数を使って
word = 'こんにちは '
print(word * 3)
様々な計算を意味する演算子と呼ばれる記号があります
ここでは代入演算子 (assignment operator アサインメント オペレータ)といって
変数に入っている数に対して加減乗除して,その結果を変数に入れ直します
=も代入演算子で,演算は「代入する」でしたね
\
| 演算 | 記号 |
|---|---|
| 代入する | = |
| 足し算して代入 | += |
| 引き算して代入 | -= |
| かけ算して代入 | *= |
| 割り算して代入 | /= |
\
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
変数xに3が入ってときにxに5を足して代入するときは,
x = 3
x += 5
となり,
print(x)すると
8になる
下のセルで入力してみましょう
★文字(データ)と数(データ)がまざる
\ 大人になると食べ過ぎで肥満になる人が多くなるので,
肥満度をチェックできる数値がいろいろあって,
その1つがBMI(Body Mass Index ボディ マス インデックス)
\ 体重(kg)÷(身長(m)の2乗)で計算した数が
18.5未満が「やせ」
18.5以上25未満が「普通」
25以上が「肥満」
\ Q?
身長165cm(=1.65m),体重70kgの人のBMIを計算するプログラムは?
\ height = 1.65
weight = 70
BMI = weight / (height**2)
print("身長が"+str(height*100)+"cmで,体重が"+str(weight)+"㎏の人のBMIは,"+str(int(BMI))+"です。")
\ height・ハイト=身長
weight・ウェイト=体重
体重 ÷ (身長)2を計算してBMIという変数に代入
Q?
自分の身長 (単位はm) と体重 (単位はkg) を入力してもらい,BMIを出力し,
「あなたの身長は xx mで,体重は xx kgなので,BMIは,xx です。」と表示されるプログラムは?
\ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
入力してもらうのでinput()関数を使う
x = input("身長を入れて下さい(単位m) : ")
y = input("体重を入れて下さい(単位㎏) : ")
input()で入力された数(データ)は文字列あつかいになるので,float()で小数に変える
int()だと整数になりますが,float()は小数になります
bmi = float(y) / float(x)**2
bmiは小数で割り算されるので,小数点以下が多くなるので,round()関数で四捨五入します
bmi = round(bmi,1)
bmi = round(bmi, 1)は,
「割り算で計算されたbmiを小数点第1位までの小数にして,改めてbmiに入れ直す」というコードになります
結果をprint()で出力
print("あなたの身長は", x, "mで,体重は", y, "kgなので,BMIは,", bmi, "です。")
#sample
x = input("身長を入れて下さい(単位m) : ")
y = input("体重を入れて下さい(単位㎏) : ")
bmi = float(y) / float(x)**2
bmi = round(bmi,1)
print("あなたの身長は", x, "mで,体重は", y, "kgなので,BMIは,", bmi, "です。")
さらに計算は続きます
Q?
10
13
2つの式の結果を比べるからprint()を使う
print()
print()
Q?
13
31
Q?
221
122
Q?\ 71 + 73 + 71 + 77 + 77 + 73 + 78 + 78 = ?
Q?
21 + 62 + 43 + 64 + 75 + 96 + 87 = ?
Q?
(28 + 48 + 18) ÷ (24 + 44 + 14) = ?
Q?
123456789と,この数を適当に数字を入れかえてできる数(例えば597324186)の差は9の倍数?
(597324186 - 123456789) / 9
Q?\ 上の問題で,数字を適当に入れ替えて別の数でも確認
いろいろ計算してみよう
Q?\ 239
#式が2つなのでprint()を使ってね
Q?
1089
1089
Q?\ 1089
Q?
1089
1089
Q?
1089
1089
Q?
594 + 1584
1334 + 1344
Q?
15873
15873
15873
15873
15873
15873
15873
15873
15873
Q?
987654321
987654321
987654321
987654321
987654321
Q?
12345679
12345679
12345679
12345679
12345679
12345679
12345679
12345679
Q?
51249876
16583742
8745231
Q?
297
and
88 + 209
Q?
2728
and
744 + 1984
Q?
148149
Q?
1111111111
and
1234567890 + 0987654321
1234567890 + 0987654321 = 1111111111 ということでした。
Q?
297
and
26 + 198 + 073
Q?
39
3
Q?\ 981
Q?
5
515
Q?
(68320 + 14336)
Q?
94 + 44 + 74 + 44
Q?
13 + 53 + 33
Q?
33 + 73 + 13
Q?
111211
112111
Q?
304 + 1204 + 2724 + 3154
3534
Q?
275 + 845 + 1105 + 1335
1445
Q?
”ハノイの塔”で円板が4枚のときに移せる回数は,
2
これをPythonで計算するときは,2**4 - 1
では,円板が64枚のときは何回で移せる?
\ "ハノイの塔"についてはググってみて下さい。
\
print('(答):', , '回')
上の空欄に考えた計算式を入れると,「(答):~~~~回」と表示されます
答は
print('(答):', 2**64 - 1 , '回')
ほかの計算もやってみよう
Q?
239
Q?
7373
Q?
73
Q?
11
Q?
101
Q?
11
Q?
1000001
Q?
1729 ÷ 19
答が19の逆になるということでした。
Q?
9999
Q?
99999
Q?
999999
Q?
999
9**99
29512665430652752148753480226197736314359272517043832886063884637676943433478020332709411004889
次の計算は実行しないように\ 9の(9の9乗)乗 テトレーション(累々乗)(るいるいじょう)というそうです
9**(9**9)
別の計算をすすめましょう
Q?
1234 + 3087
2345 + 3087
3456 + 3087
4567 + 3087
5678 + 3087
6789 + 3087
Q?
76
42781376
下2ケタが76になる ということでした。
Q?
183 (18
答がでたら,答の各位の和を計算
Q?
185
\
これの答の各位の積も計算
さらに,その答えの各位の和を計算
最後に積が2けたの数になるまで計算すると
Q?
186
答が出たら,答えの各位の和を計算
Q?
1810
答が出たら,答の各位の積を計算
さらに,その答えの各位の和を計算
Q?
13 + 23 + 33 + 43 + 53 + 63 + 53 + 43 + 33 + 23 + 13
22 + 32 + 52 + 72 + 112 + 132 + 172
Q?
662
6662
66662
666662
6666662
66666662
666666662
print()を利用しましょう
666666 → 第一種レギオン数と言うそうな(なんのこっちゃ)
これくらいの計算はColabでは瞬殺
Q?
195 + 192 + 191 + 193 + 195 + 196 + 194 + 190
Q?
5882 + 23532
Q?
5882353
Q?
この計算の結果にも注目!
\ 389105058365758754863813229571984435797665369649805447470817122 + 6225680933852140077821011673151750972762645914396887159533073932
\ かなり大きい数なので注意して入力
min, max, abs)\ このノートで時々出てくる組み込み関数の紹介
min()関数 = minは,minimum(ミニマム)の略で,( )の中の数の最小値を求めて出力
max()関数 = maxは,maximum(マキシマム)の略で,( )の中の数の最大値を求めて出力
abs()関数 = absは,absolute(アブソルート)の略で,( )の中の数の絶対値を求めて出力
\ 3, 15, 8のなかの最小を求めるには
min(3, 15, 8)
3
3, 15, 8のなかの最大を求めるには
max(3, 15, 8)
#小数でもOK
print(min(3, 15, 0.3))
#分数・式でもOK
print(min(3, 15, 0.3, 2/17))
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
組み込み関数abs()
数直線上で,ある数と原点との距離を絶対値といいますが,abs()関数はかっこの中の数の
絶対値を表示します。
\ ことばではわかりにくいですが,式で表せば次のことです。
\ 絶対値は| |の記号で表し,
|+7| = 7
|-15| = 15
|24 - 87| = 63
という感じです
これをabs()関数で表すと, (ここでの = は等号イコールです)
abs(+7) = 7
abs(-15) = 15
abs(24 - 87) = 63
ようは,「+はそのまんまの数,-の場合は-をとった数」と覚えておけばOK
Q?
| -190 |を求めよ
\ (- 8)
print(abs(-190))
abs(-8 * 7)
190
56
Q?
1428 ÷ 7 - 4392 ÷ 24
(答21)
Q?
32-{12+(25-16)÷3}
(17)
Q?
231
(82)
Q?
(16 + 2008 ÷ 8)
(6)
Q?
75 - (25 - 5)
(19)
Q?
108 ÷ {21 - (39 ÷ 3 - 5
(6)
Q?
4 + 55 ÷ {33 - 2
(9)
Q?
(2007 - 997)
(293)
Q?
137
(34)
Q?
{202 - 2
\ (202 - 2 * (55 - 8)) / (4 + 66 / (22 + 11))
Computer (コンピュータ) は小数点( decimal )の計算( calculation )が苦手?
例えば,
Q?
5.9 + 0.4
を計算すると
#計算して確認
6.300000000000001
Q?
10 / 3 とかも
最後が5になっとる
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
苦手な理由はさておき,小数点の計算ではdecimal module (デシマル モジュール)
というプログラムprogramを使うと,学校の授業でやった計算と同じになります。
\ moduleモジュールは自分のプログラムのなかで使うことができる別のプログラム(の集まり)で,
そのmoduleの中のDecimalというプログラムを使います。
Decimalのプログラムを作るほうがプログラムの練習になるでしょうが,
それは大変なのですでに作ってあるDecimalをつかいます。
\ 将来的にはDecimalのプログラムもチャレンジ
\ <Decimalを使った小数の計算のcode>
\ 要は数字をDecimalの中に入れるとふつうに計算できるようになる
5.9
from decimal import Decimal
print(Decimal("5.9") * Decimal("0.4"))
*や+などの演算子は変わらずに使えます
\ (注意)
➀ from decimal import Decimalこれを使い始めのコードセルで書いておけば
ほかのコードセルでは書かなくてもDecimalが使えるようになってます
ただし,次の日は使えません
ちなみにdecimalとDecimalは違います
decimalは「プログラムの集まり(モジュールといいます)」で,
Decimalはdecimalの中のプログラムの1つ
\ ② Decimal(5.9)ではなく,Decimal("5.9")またはDecimal('5.9')と書く
\ ③ print関数を使わないと下のようにDecimal('6.3')と outputされます
(output は input の反対で,「出力,出力する」)
\ ④ Decimal("5.9")*Decimal("0.4")でもいいが,これのoutputは,
Decimal('2.36') と表示される
Q?
5.9
\ from decimal import Decimal #その日のうちは(正確にはセッションが切れなければ)省略OK
print(Decimal('5.9') * Decimal('0.4') + Decimal("12.6") * (Decimal('4.8') - Decimal("3.4")))
\ (" ")か(' ')かはどちらでも使えるが,見た目そろえたほうがいいかも
Q?
68.1 - 45.6 ÷ 7.6
そのまま計算すると,
上のようになってしまうので,Decimalをつかって
#sample
from decimal import Decimal
print(Decimal('68.1') - Decimal('45.6') / Decimal("7.6") * Decimal('7.6') * Decimal("3.7"))
-100.62
Q?
(35.7 - 28.7
Decimalを使って
Q?
1.1 + 11.11 + 111.111 + 1111.1111 + 11111.11111 + 111111.111111 + 1111111.1111111
Q?
1 ÷ 49
1/49
Decimalを使うと,小数点以下のけた数も多くなる
from decimal import Decimal
その日のうちは(正確にはセッションが切れなければ)省略OK
print(Decimal('1') / Decimal('49'))
Q?
1 ÷ 4999
Q?
1 ÷ 9997
Q?
5 - 3 ÷ 18
\ これは分数で計算したほうがよい→後で
小数点以下100ケタまで表示したい!(そんなときはあまりないけど)
循環小数に関して
普通の計算では表示されるケタ数がそれほど多くない
それでも小数点以下16位以上は出ます
1/3
0.3333333333333333
1/243
0.00411522633744856
1/81
#0.12345679012345679012345679……のはずだが
0.012345679012345678
1 ÷ 4999 を小数点50位まで計算
#普通に計算すると
1/4999
0.00020004000800160032
もっと多く表示されるとより面白いかも
50ケタくらい行きたい
from decimal import Decimal, getcontext
getcontext().prec = 50
print(Decimal('1') / Decimal('4999'))
ちょっと難しいcodeが出てきたので,ここはおまじないだということで
そのまま打ってみて下さいまし
とりあえず結果確認
上の計算結果を4ケタで区切ってみると,
2 → 4 → 8 → 16 → 32 → 64 → 128 → 256 → 512 → 1024 → 2048 → 4096
となっている
Q?
3 ÷ 9997 を小数点50位まで計算してみるためのコードは?
Q?
\ を小数点100位まで計算
from decimal import Decimal, getcontext
getcontext().prec = 100
print(Decimal('1') / Decimal('6'))
print(Decimal('1') / Decimal('7'))
print(Decimal('1') / Decimal('17'))
print(Decimal('1') / Decimal('81'))
print(Decimal('1') / Decimal('113'))
print(Decimal('1') / Decimal('9801'))
Q?
\
\
\ を小数点100位まで計算
Q?
小数点100位まで計算
循環節は42ケタでした
ちなみに
素数の逆数の循環節の長さは"最大で" (素数)-1 だそうです
97も17も素数です
循環小数(上とダブってるけど気にしな~い)
0.0909090909・・・
となり,これは循環小数で,下のようにかきます
#1/11を計算
7以上の prime number (素数)の逆数( reciprocalを decimal (小数)にすると
循環小数(じゅんかん しょうすう repeating decimal )になることを確認し,
LaTeXを使った循環小数
Decimalを使った計算結果も確認
from decimal import Decimal
print(Decimal('1') / Decimal('7'))
1周期の小数を足すと?
Q?
Q?
1周期の和は?
Q?
Q?
1周期の和は?
Q?
Q?
1周期の和は?
Q?
最後に確認
和は全部何の倍数でしたか
\ この分数はLaTexという数式ソフトを使って表示しています。
書き方は,このセルをダブルクリックすると分かりますが,
式の初めと終わりに$ マーク
LaTeXを使う式の前に \ (バックスラッシュ / back slash )
dfrac : displaystyle fraction の略で,分数を表示するときに使う
frac とすると,同じ分数表示だが,分数が小さくなるので dfrac がおすすめ
dfracの後の{1}{2}は前が分子,後が分母
以下は,fracを使った表示
LaTeXを使った循環小数
LaTeXを使った足し算の筆算
LaTeXを使ったかけ算の筆算
LaTeXを使った割り算の筆算 (うまくいかない)
ほかには今は分数や大きな括弧くらいしかLaTexを使わないかもしれませんが,\ 中学・高校になると知っていると便利
$\begin{eqnarray}
\
\
将来的はこんな式も?
はじめに%%latexと入れると
%%latex
x^2
# コードでもLaTeX表示
%%latex
\displaystyle
\frac{\pi}{2}
=
\left( \int_{0}^{\infty} \frac{\sin x}{\sqrt{x}} dx \right)^2
=
\sum_{k=0}^{\infty} \frac{(2k)!}{2^{2k}(k!)^2} \frac{1}{2k+1}
=
\prod_{k=1}^{\infty} \frac{4k^2}{4k^2 - 1}
sympyでLaTeX表示ができる
[SymPy] LaTeX による数式表示
'''
[SymPy] LaTeX による数式表示
sympy.init_printing() を打っておくと,数式をLaTexで表示させる
実際に表示させるにはdisplay()コマンドを使う
さらに,数式のLaTex表示をするにはsympy.latex()コマンドを使う
'''
import sympy
# LaTeXで数式を表示
sympy.init_printing()
# 記号xを定義
sympy.var("a b x y")
# f(x)=exp(x)*cos(x)
f = sympy.exp(x) * sympy.cos(x)
# f(x)をaからbまでxで積分する
i = sympy.integrate(f, (x, a, b))
# 数式をまとめる(整理する)
i = sympy.simplify(i)
# 数式をLaTeXで表示
display(i)
# 数式のLaTeXコマンドを表示
print(sympy.latex(i))
\frac{\sqrt{2}}{2} \left(- e^{a} \sin{\left (a + \frac{\pi}{4} \right )} + e^{b} \sin{\left (b + \frac{\pi}{4} \right )}\right)
import sympy
sympy.init_printing()
x = sympy.Symbol("x")
x**2
ちょっとだけ関数練習
Q?
2つの数の積を計算する関数のプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
関数をつくる=「定義する」から,defではじめます
その行の終わりに:(コロン)をつける
かけ算なので,関数の名前をmultiply
2つの数のかけ算なので,multiply(引数)を,multiply(a, b)とします
引数=argument(アーギュメント) よくarg,Argと略されてます
\ aとbの数を入れると,かけ算を計算して返す = returnので,(returnは「返す」の英語)
return a * b
インデントを忘れずに
\ 関数を動かす=「関数を呼びだす」
関数名に引数を入れるだけ
#Write code here
#sample
def multiply(a,b) :
return a * b
multiply(2, 3)
6
Q?
スペースで分けて入力した文のはじめのひと言だけを返す関数は?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「はじめのひと言」だから,関数名をFirst_words
文・文章を入れるので,引数をtext(テクスト・テキスト,文とか本の英語)
スペースで分けた文からはじめのひと言を分離する組み込み関数がsplit()(スプリット)
はじめの部分なので[0]とします
#sample
def First_words(text) :
return text.split()[0]
First_words("あけまして おめでとう")
'あけまして'
Q?
12.5 - 6
(答:5.9)
from decimal import Decimal
print(Decimal('12.5') - 6 * Decimal('0.5') * Decimal('0.66') / Decimal('0.3'))
Q?
(35.7 - 28.7
(50)
Q?
5.2 ÷ 1.3 ÷ 0.25 - 0.4 ÷ 0.25
(14.4)
分数 (fraction/フラクション)
fraction (分数)=
\ numerator と denominator
分数の計算も小数の計算同様に少しやっかい
\ 割り算と同じ考え方で分数の計算をするから
例えば,
となりますが,これをPythonで,3/5 + 1/3 とcodeをかくと
下のセルで計算すると分かるように,0.6 + 0.33333…… と計算してしまい
分数で計算してくれない
そこで,ここではPythonで分数計算をする module (モジュール)を使ってみます。
moduleは自分のプログラムのなかで使うことができる別のプログラム
分数計算につかうmoduleは,fractions module といい,
これはいろいろなプログラムの集まりで,
その中のFractionというプログラムを使います。
Fraction のプログラムを作るほうがプログラムの練習になりますが,
大変なのでFractionプログラムを使います。
将来的には,Fractionのプログラムの作成にもチャレンジしてください。
★<分数その1> fractions モジュール
小数でdecimal moduleを使いましたが,分数計算では fractions moduleを使います。
\
from fractions import Fraction
print(Fraction(3,5) + Fraction(1,3))
\ (説明&注意)
\ ➀ from fractions import Fractionもfrom decimal import Decimalと
同じで,一度書いておけばその日のうちはほかのコードセルでは省略可
ちなみにfractionsは「プログラムの集まり(モジュールといいます)」で,
Fractionはfractionsの中のプログラムの1つ
\ ② Fraction(分子, 分母)で分数を表す
\ ③ 出力は,print関数を使わないFraction(3,5) + Fraction(1,3)だとFraction(14,15)と output される
\ ④ ( )括弧を正しくつけないとエラーになるので注意
\ ⑤ Decimal('3.5')のように中の数を' 'でくくる必要はない,つけてもエラーにはなりませんが
約分
\
\ 分数が負の数(マイナス)になっていますが,ここは説明のため
負の数は後で出てきます
\ from fractions import Fraction #その日のうちは省略可
print(Fraction(16, -10))
print(Fraction(-16, 10))
\ 「-(マイナス記号)は(分子,分母)のどちらにつけてもOK」ということです
小数を分数にする
\ Q?
-0.875 =
\ codeが面倒なことになりますが,FractionとDecimalを使って,
from fractions import Fraction
from decimal import Decimal
print(Fraction(Decimal('-0.875')))
Fraction(Decimal("-0.875"))
次のコードでも大丈夫だけど,小数によってうまくいかないときがある
from fractions import Fraction
print(Fraction('-0.875'))
print(Fraction(-0.875))
Fraction(-0.875)
これはFractionだけで大丈夫だった
\ Q?
2.25 =
1.1 =
次のコードでは
from fractions import Fraction
print(Fraction(1.1))
Fraction(1.1)
#sample
from fractions import Fraction
print(Fraction(2.25))
原因がよく分からず,\ \ from fractions import Fraction #その日のうちは省略可
from decimal import Decimal #その日のうちは省略可
print(Fraction(Decimal('1.1')))
Fraction(Decimal('1.1'))
こうすればいいみたいだが,おこのみで\ \ from fractions import Fraction #その日のうちは省略可
x = 1.1
print(Fraction(x).limit_denominator(1000))
分数と整数と小数の計算
\ Q?
\
\ from fractions import Fraction
print(Fraction(3,4) + 1 + 1.5)
Fraction(3,4) + 1 + 1.5
\ 答は小数で出てきます
Q?
\ 全部分数に直すと答えは分数で出てきます
\ from fractions import Fraction
print(Fraction(1,3) + Fraction(1,1) + Fraction(3,2))
こんな方法もあるらしい\ \ from fractions import Fraction
x = 1/3 + 1 +1.5
print(Fraction(x).limit_denominator(1000))
\ いろいろ調べてみるのもよいかも
Q?
\ 割り算は分数にしてしまう
\ from fractions import Fraction
print(Fraction(3,4) + 1 + Fraction(1,4))
Fraction(3,4) + 1 + Fraction(1,4)
これは小数をそのままでいけました\ \ Q?
\ from fractions import Fraction
Fraction(3, 8) + 0.125/(Fraction(15, 8) - Fraction(5, 4)) - 0.3 * 1.5 + Fraction(1, 2)
Rational(sympy)
sympy/シンパイはいろいろな計算プログラムが入っているmodule/モジュール
今はfractions moduleでも十分だが,ゆくすえはsympyをかなり利用するらしい
ここでは,sympyの中のRationalという分数の機能だけ利用する
Rationalは有理数(rational number=分数で表せる数)という意味
分数計算の前に少し遊んでみる
つぎのcodeを実行すると,そこそこの小数点で円周率(パイ, pi)がでてくる
\ from sympy import Float, pi
Float(pi)
さらに次のcodeを実行してみると,
\ from sympy import Float, pi
print(Float(pi,30))
print(Float(pi,100))
print(Float(pi,10000))
もう1つ
for文の練習として10!の計算をするプログラムを下のようにつくった
(!はビックリマーク=factorialファクトリアル でしたね)
\ product = 1
for n in range(1,11):
product *= n
print(product)
sympyモジュールの中にまさにfactorialというプログラムがある
\ from sympy import factorial
factorial(10)
\ フォント(字体)もちょっとおしゃれ?
分数計算しましょう
\ Q?
Rationalで計算
\ これを計算するコードは
from sympy import Rational
Rational(1,3) + Rational(2,5)
\ Fractionと同じでRational(分子,分母)
分数の計算をして,Latexで作ったような分数でoutput
Latexについては「LaTexlatex」のところを見てください
print(Rational(1,3) + Rational(2,5))
とすると,11/15 とoutputされる
約分もできる
\ Q?
\ from sympy import Rational
Rational(1001,10101)
Fractionでも約分\ \ from fractions import Fraction #当日中は省略可
print(Fraction(1001, 10101))
約分\ \ Q?
Q?
分子と分母を1~9の数字を1回使った数で作ったこんな分数を約分すると
\
\
\
from sympy import Rational
Rational(6729, 13458)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
(前にも掲載してますが)
分数の表示方法\ \
\ ここで出てきた分数はLaTexという数式ソフトを使って表示しています。
書き方は,このセルをダブルクリックすると分かりますが,
式の初めと終わりに$ マーク
LaTeXを使う式の前に \ (バックスラッシュ / back slash )
dfrac : displaystyle fraction の略で,分数を表示するときに使う
frac とすると,同じ分数表示だが,分数が小さくなるので dfrac がおすすめ
dfracの後の{1}{2}は前が分子,後が分母
以下は,fracを使った表示
LaTexに関しては「LaTexLatex」section を見てね\ 理系にすすむなら知ってると便利らしい
1~9の数字を1回ずつ使った分数のかけ算\ \ Q?
\ from sympy import Rational #当日中は省略可
Rational(18534,9267) * Rational(17469,5823)\ \ 計算して答は6だけど,
商も1~9の数字を1回使った分数で表せるということがオチ\ \
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
分数計算
\ Q?
\ from sympy import Rational #当日中は省略可
Rational(355,113) + Rational(1,3)
Q?
よく登場する1~9の数でできた分数の約分
\ Q?
(2009年灘中)
\ Q?
\ (328)
\ Fractionで
from fractions import Fraction #当日中は省略可
print('□ =', 1/(Fraction(1, 2009) + Fraction(1, 392)))
Rationalでも
from sympy import Rational #当日中は省略可
print('□=', 1/(Rational(1,2009)+Rational(1,392)))
(2015年麻布)
\ Q?
\ (10/7)
\ 全部分数に直して
from fractions import Fraction
print((Fraction(46,15) - Fraction(156,100) / (Fraction(5,4) - Fraction(6,10))) / (Fraction(5,3) - Fraction(12,10)))
前にも出てきたcodeでもOK
from fractions import Fraction #当日中は省略可
x=(46/15-1.56/(5/4-0.6))/(5/3-1.2)
print(Fraction(x).limit_denominator(1000))
Q?
50 - (□
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
算数で解く流れは,
□
□
□ = (50 - 31 - 4) ÷ 3 = 5
だから
□ = xとして,
x = (50 - 31 - 4) / 3
print(x)
x = (50 - 31 - 4) / 3
print(x)
5.0
Q?
60
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上と同じようにやると
□ = (11 - 49 ÷ 5)
これをcodeにすると
x = (11 - 49/5) * 20 / 60
print(x)
この場合は0.4にならないので
sympyのRationalを使うと
from sympy import Rational
x = (11 - Rational(49,5)) * 20 / 60
print(x)
Fractionを利用する方法もある\ ここは自分で式をつくってみて\ (Fractionの利用はあとの問題でもでてくる)
少し複雑な逆算
Q? \
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
逆算の式をつくる
#sample
print((20 - 40/3) * 0.25 / (4/3 - 2/9))
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上のセルの式でも演算できますが,
ここではsympyを使った方程式による解法を使います
\ この方法は算数文章題の解法でもよく使うので覚えておいた方がいい
\ sympyモジュールから
var()(variable/バリアブル・変数という意味)という変数を決めるプログラムと,
solve()(ソルブ・解くという意味)という方程式を解くプログラムをimport
from sympy import var, solve
□をxとするので,xという変数を使うというコードを書く
var('x')
xを' 'で囲うことを忘れずに
\ 問題の式を(左辺)=0となるように書き替える→ (左辺)というのは=の左側の式のこと
\ 20 - x * (4/3 - 2/9) / 0.25 - 40/3となるから
この式をsolveの中に入れると
xがいくつかを計算してくれるので,その答えをanswer(aでもよい)という変数に入れる
answer = solve(20 - x * (4/3 - 2/9) / 0.25 - 40/3, x)
solve((左辺の式), x)と書くのは,(左辺)の式の中のxを求めますよという意味
\ 最後にanswerをprintする
\ 数式を LaTeX形式で表示させたい場合は display()関数を使います
display(answer[0])
print(answer)やdisplay(answer)でも答はでますが
display(answer[0])だときれいに表示される
\ 理由は後で出てくるので,ここではそのまま覚えて下さい
\ また,うまく表示されないときは
sympy.init_printing()
を2行目に入れてみて下さい
#sample
from sympy import var, solve
var('x')
answer = solve(20 - x*(4/3- 2/9)/0.25 - 40/3, x)
display(answer[0])
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
分数表示にしたいときは,Rationalプログラムもimport
from sympy import var, solve, Rational
変数を決めて
var('x')
solveで解いて答をanswerに入れて
answer = solve(20 - x * (Rational(4,3) - Rational(2,9)) / Rational(25,100) - Rational(40,3), x)
displayで表示
display(answer[0])
(2013年灘)
\ Q?
\ (答3)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
逆算の方法
1/□をxとすると
x = (1/11 - 1/183) * 167 / 43 + 1/671
求めるのは1/xなので,
y = 1/x
x = 1/xでもOKだけど,混乱しないようにあらためて変数をyとした
print(y)
yに入れずに,print(1/x)でもいい
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上の逆算の方法だと,3.0にならないので
from sympy import var, solve, Rational
変数を決めて
var('x')
solveで解いて答をanswerに入れて
ただし,Rationalにはxは入れられないから1/xのまま
answer = solve((Rational(1,11) - Rational(1,183)) / 43 - (1/x - Rational(1,671)) / 167)
displayで表示
display(answer[0])
(2005年灘中)
\ Q?
\ (163)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
逆算の方法
□をxとすると
x = (2005/17 - 48*17/7)*119
print(x)
163にならないので,sympyでやってみる
varとsolveをimport
from sympy import var, solve
□のかわりにxを変数とする
var('x')
問題の式を,(左辺)=0の形に変えると,
2005
□をxに変えた式をsolveに入れて,答えをanswerに入れる
answer = solve(2005 * 1/17 - x * 1/119 - 48 * 17/7, x)
answerをdisplayで表示
display(answer[0])
(2007年灘中)
Q?
\
\ (42)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
逆算の方法
print(1 / ((1/2 + 1/3 + 1/7) - (1/4 + 1/5 + 1/6) / (19 - 1/2) * (200/7)))
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
varとsolveをimport
from sympy import var, solve
□のかわりにxを変数とする
var('x')
問題の式を,(左辺)=0の形に変えると,
7/200
□をxに変えた式をsolveに入れて,答えをanswerに入れる
answer = solve(7/200 * (1/2 + 1/3 + 1/7 - 1/x) - (1/4 + 1/5 + 1/6) / (19 - 1/2), x)
answerをdisplayで表示
display(answer[0])
(2008年灘中)
\ Q?
\ (8/17)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
逆算の方法
print(4128/91 / (3 - 5/13) - 2008 * 1/119)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
答が分数になるみたいで,ここはFractionでやってみる
\ fractionsモジュールからFractionをimport
from fractions import Fraction
\ 仮分数に直さずに,45
それを利用して逆算の式を作成
print((45 + Fraction(33,91)) / (3 - Fraction(5,13)) - Fraction(2008,119))
もちろんRationalを利用する方法もあるので興味がある人はやってみよう
(20014年灘中)
Q?
\
\ (77)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
逆算の方法
print(72/(26 - (12 - 10/33) * 15/7))
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これもFractionでやってみる
\ fractionsモジュールからFractionをimport
from fractions import Fraction
分数はFractionで表示させて逆算の式を作成
print(72 / (26 - (12 - Fraction(10,33)) * Fraction(15,7)))
(2015年灘中)
Q?
\
\ (6/65)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これもFractionでやってみる\ \ fractionsモジュールからFractionをimport
from fractions import Fraction
逆算の式は
となるので,分数をFractionで表示させて逆算の式を作成
print(Fraction(1,2015) / Fraction(1,3) - Fraction(1,31) + (Fraction(1,5) - Fraction(1,13)))
これから負の数はよく出てくるのでちょっと慣れておく
\ 5 + x = 0 と計算できるxを -5 (マイナス5)と表し,これが負の数
\ 数直線でいえば,0をはさんで正の数(positive number・ポジティブ ナンバー)と反対側の数
\ 寒暖計で零下10度を数字で書くと-10℃で,この-10が負の数
inputして負の数を確認
4 - 8で実行▶
(-4) + (-8)
(-4) + (-8) = -4 - 8
(-4) - (+8)
(-4) - (+8) = -4 - 8
4 + (-8)
4+(-8)=4- 8
(-4) + (+8)
(-4) + (+8) = -4 + 8
(-4) - (-8)
(-4) - (-8) = -4 + 8
4 $\times$ (-8)
(+)
(-4) $\times$ 8
(-)
(-4) $\times$ (-8)
(-)
(-4) ÷ 8
(-) ÷ (+) = (-) :(マイナス) ÷ (プラス) = (マイナス)
4 ÷ (-8)
(+) ÷ (-) = (-) :(プラス) ÷ (マイナス) = (マイナス)
(-4) ÷ (-8)
(-) ÷ (-) = (+) :(マイナス) ÷ (マイナス) = (プラス)
-17 + 5
-12 - 2
-6 + 18
-3 - 11 + 23 -28
8 - 7 + 6 - 5 + 4 - 3
7 + (-3) - (-5) + (-2)
-7 + (-3) + (-6) - (-4) + (-5)
3 - 10 + 4
7 + 2 × (-5)
(-6) × (-2) - 3
(-2) × (-3) - 7
2 + 3 × (-4)
(-2) × (-6) - 8 ÷ 4
12 + 8 ÷ (-4)
Q?\ 数字(整数)を入力してもらい,それが正の数か負の数か0かを判定するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
まず
print()で,「正の数か負の数か0かを判定します」と表示させるコード作成
print('正の数か負の数か0かを判定します')
\ 次に
int()とinput()を利用し,「整数(正負の数か0)を入れて下さい:」と表示し,入力してもらい
入力された数を整数として自分で決めた変数に代入するコード作成
x = int(input('整数(正負の数か0)を入れて下さい:'))
\ input()にさらにint()がついています (int()の中にinput()が入っている)
これは,前にもちょっと説明しましたが(input()関数),input関数で入力したデータは
文字列で出力されるので,それをint()関数で整数に変えるためです
\ 次は,「場合分け」で,
「もし0より大きければ「正の数です」とprint,0より小さければ「負の数です」とprint,
「0であれば「0です」とprintするコード作成
if x > 0:
print('正の数です')
if x < 0: #elif x < 0:でもOK
print('負の数です')
if x == 0: #else:でもOK
print('0です')
\ `(または" ")や,代入演算子や,if文の最後の:やインデント`に気をつけて
コードセルにコードを作成
\ <Sampleサンプル=例>
print('正の数か負の数か0かを判定します')
x = int(input('整数(正負の数か0)を入れて下さい:'))
if x > 0:
print('正の数です')
if x < 0: #elif x < 0:でもOK
print('負の数です')
if x == 0: #else:でもOK
print('0です')
#コードを書いてみましょう
\
| 意味 | 演算子 |
|---|---|
| 等しい | == |
| 等しくない | != |
| より小さい | < |
| 以下 | <= |
| より大きい | > |
| 以上 | >= |
| 要素になっている | in |
| 要素になっていない | not in |
\
Q?
変数aとbに入っている数の大きさを比べて大きいほうを表示して,
等しければ「aとbは等しい」と出力するプログラムは?
a, bは入力してもらいます
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
はじめに
print('aとbで大きい数を表示します')
と表示させてから
\ 「a,bに数字を入れてもらう」コードは
a = int(input('aに整数を入れて下さい:a ='))
b = int(input('bに整数を入れて下さい:b ='))
\ input()にさらにint()がついています (int()の中にinput()が入っている)
これは,前にもちょっと説明しましたが(input()関数),input関数で入力したデータは
文字列で出力されるので,それをint()関数で整数に変えるためです
\ 次に条件がわかれますのでif文を使います
\ 「aが大きければaをprint,bが大きければbをprint,等しければ「aとbは等しい」とprintする」コードは
if a > b:
print(a)
if a < b:
print(b)
if a == b: #a = bとしないように
print('「aとbは等しい」')
\ <比較演算子の説明>
ここで出てきた>,<,==の記号は,
大きさを比較する演算(えんざん)をする比較演算子(ひかくえんざんし)といいます
これからたくさん出てくるのでじょじょに慣れると思います
\ =は代入演算子で←「右の値を左に入れる」の意味
==が算数の=(イコール)と同じ意味になりますので注意して使ってください
\ <if文説明>
if(イフ)というのは「もし~ならば」という意味の英語で,算数で言う「場合分け」をする機能です
\ プログラムをつくるとき,「もし~ならば〇〇し,もし~~ならばXXする」
というような算数でやる「場合分け」(条件分岐・じょうけんぶんき)が非常にたくさん出てきます!!!
その場合にif文を使います
\ これもこれからたくさん出てくるのでじょじょに慣れます
\ 下の<Check it Out>で確認
\ if文では,(条件)のあとに:(コロン)をつけることと,
その下に書かれる(操作内容)を表す文ではindent(インデント=字下げ)
を忘れないようにしましょう
\ if文は
if (条件) :
(操作内容)
というコードでif文のひとまとまりを表すためにインデントします
\ 同じ意味のコードで
if a > b:
print(a)
elif a < b: #2つ目の場合分け(条件分岐)
print(b)
else: #「上2つの場合以外」という意味
print('「aとbは等しい」')
という書き方の方が多いですが,この問題ではifで大丈夫です
\ elif, elseを使わないといけない場合わけは,次の問題で確認してください
3つ以上の複雑な場合分けのときはこの書き方が威力を発揮すると思います
#ここでコードをかいて動かしてみましょう
#sample
print('aとbで大きい数を表示します')
a = int(input('aに整数を入れて下さい:a ='))
b = int(input('bに整数を入れて下さい:b ='))
if a > b:
print(a, 'と', b, 'では,', a, 'のほうが大きいです')
if a < b:
print(a, 'と', b, 'では,', a, 'のほうが大きいです')
if a == b: #a = bとしないように
print(a, 'と', b, 'は,', '等しいです')
<Check it Out>
コンピュータがプログラムを読んで動く(計算する)とき,その動き方は3種類しかない
コンピュータはそれくらいシンプルなんですね
\ ➀プログラムが書かれた(上から下へ)順番に動く
②繰り返し動く
③条件で動きが分かれる(条件分岐・じょうけんぶんき→場合分けのこと)
\ ②はfor文のことで,③はif文のことです
3つ以上の場合分け = 条件分け(条件分岐ぶんき)が必要なときはelif, elseを使う必要がでてきます
上の例も3つの場合分けだったし,「全部ifでいいじゃん」と思うと思いますが,問題によってはそうではありません
次の問題にすすみます
\ ここの例は,「ifやelifの使い方」や「場合分け(条件分岐)を考えたコードの書き方」を確認してもらうためです
はじめに1つ目の問題
Q?
英語のテストの点数を入力してもらい,85点以上だったら合格,85点未満だったら不合格を表示するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
はじめに
print('合格か不合格かを判定します')
と表示させてから
\ 「テストの点数を入れてもらう」コードは
a = int(input('英語のテストの点数を入れて下さい:'))
\ 前の例と同じく,int( input() )とします
\ 次に条件がわかれますのでif文を使います
\ 85点以上だったら「合格」をprint,85点未満だったら「不合格」をprint
if a >= 85:
print('「合格です」')
if a < 85:
print('「不合格です」'))
\ if a < 85:はelse :でもいいですね
#sample
print('合格か不合格かを判定します')
a = int(input('英語のテストの点数を入れて下さい:'))
if a >= 85:
print('「合格です」')
else :
print('「不合格です」')
#if a >= 85:
# print('「合格です」')
#if a < 85:
# print('「不合格です」')
では次の問題です
\ Q?
英語のテストの点数を入力して,合格・不合格・満点を表示するプログラムは?
85点以上は「合格」
100点だったら「満点です!」
85点未満だったら「不合格」
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここで注意しなければいけない点があります
if文で,次のように書いた場合で,
if a >= 85:
print('「合格です」')
if a == 100:
print('「満点です」')
if a < 85:
print('「不合格です」')
ここで,100点だった場合,どうなるかを下のセルで確認してみて下さい
#sample
print('合格か不合格かを判定します')
a = int(input('英語のテストの点数を入れて下さい:'))
if a >= 85:
print('「合格です」')
if a == 100:
print('「満点です」')
if a < 85:
print('「不合格です」')
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ifをelifとelseにかえて,100点の場合を確認してみましょう
#sample
print('合格か不合格かを判定します')
a = int(input('英語のテストの点数を入れて下さい:'))
if a >= 85:
print('「合格です」')
elif a == 100:
print('「満点です」')
else:
print('「不合格です」')
順番を変えないようにするためには,if文の変更が必要です
下のコードで100点の場合を確認
#sample
print('合格か不合格かを判定します')
a = int(input('英語のテストの点数を入れて下さい:'))
if a >= 85 and 100 > a:
print('「合格です」')
elif a == 100:
print('「満点です」')
else:
print('「不合格です」')
よりシンプルなコードは,if文で,a >= 85とa == 100を入れかえる
#sample
print('合格か不合格かを判定します')
a = int(input('英語のテストの点数を入れて下さい:'))
if a == 100:
print('「満点です」')
elif a >= 85:
print('「合格です」')
else:
print('「不合格です」')
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
elifやelseを使わないといけないほかの例は,次のfor文をやってからまたでてきます
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Q?
1から10までの和を計算
\ 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10
Q?\ 「1から10までの和を計算する」プログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
プログラムのイメージとしては
「1から10までのカードを順番に取り出し箱に入れると,箱の和の表示が順番に増えていく」
くらいの感じです
\ 和は英語でsum(サム)なので,まずはじめに計算した和を入れる箱sumを0にしておきます
sum = 0
箱のことを変数といいます
変数とよばれるのは,sumは数を入れるたびに和がどんどん変わっていくからと考えて下さい
名前はsumでなくても,sでもaでもOKで,それは自分で決めます
\ このはじめが0のsumに1から10までの数を順番に取り出して足していくというイメージです
\ 1から10まで順番に数を順番に取り出すことを繰り返すことを表すコードであるfor文を使います
繰り返しのプログラムをfor(フォー)文といって,ifと同じくらいこれから非常に多く出てきます
下の<Check it Out>確認
\ for文は
for 変数 in (数や値の集まり):
(操作内容)
というようなかたちのcodeになります
\ 変数はsumと同じで自分できめます
「変数に1から順番に10まで代入する」というコードであれば
for n in range(1,11):
と書きます
10までの場合は,11の手前までということで,range(1, 11)と書きます
range(1, 10)としないことが大切です
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ちょっとした説明にはなりますが,
for文は,「数や文字などのデータの集まり」から,「データを一つずつ取り出す」という作業で,
これを反復処理ともいうようです
\ 1回の反復処理をiteration(イテレーション)といって,これからよく聞く言葉だと思います
動詞はiterate(イテレイト)繰り返す・反復する
ちょっと出てきた「辞書」やこれから出てくる「リスト」の中身(「要素」といいます)を1つずつ取り出す
作業ができるforはiterator(イテレータ)
「辞書」や「リスト」などは,for文でiterationされますので,iterable object(イテラブル オブジェクト 反復処理できるモノ)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
nは1から10まで取り出した数を入れる変数で,nよりiをよく見かけるかもしれません
\ forの最後には:(コロン)を必ずつけることを忘れないように
:はコロンcolonで,;はセミコロンsemi-colon
\ range(1,11):は1から順に10までの範囲の整数を表します
range(レインジ・レンジ)は「範囲」を表す英語です
1から10までのときはrange(1,11):になることに注意です
1から15までだったらrange(1,16)になります
for n in 1,2,3,4,5,6,,7,8,9,10 :という書き方もありますが,
範囲が大きくなると書くのが大変です
\ 「nに1から10まで順番に代入し,そのnをsumに足していく」というコードを
for n in range(1,11):
sum += n
と書きます
\ この2行がひとまとまりになるのでsum += nはfor文より少し下げます
:をつけてEnterすると,Colabが勝手に字下げしてくれます
「少し下げる」ことをインデント(indent)といいます
\ 少し下げるインデントで繰り返し処理機能のひとまとまりを表します
ifのインデントと同じです
\ sum += n は
sum = sum + n と書いてもいいですが,+=は略して書くための演算子で,
代入演算子といいます(よく使います)
\ 代入演算子については下で確認
\ 「今までの和が入っているsumにnを足して,sumに入っている和を置き換える」
というイメージです
\ nが1から10まで繰り返されるとfor文は終わって,
最後にprint(sum)で,1から10まで足した和になっているsumを表示します
print(sum)はfor文のひとまとまりの中には入っていないので
sum = 0やfor n in range(1,11):と同じ位置から書き始めます
\ 最後にコードをまとめると,
sum = 0
for n in range(1,11):
sum += n
print(sum)
<Check it Out>
コンピュータがプログラムを読んで動く(計算する)とき
その動き方は3種類しかない
コンピュータはそれくらいシンプルなんですね
\ ➀ プログラムが書かれた順番に動く
② 繰り返し動く
③ 条件で動きが分かれる(条件分岐・じょうけんぶんき)
\ 上でやったプログラムでは➀と②で動いてoutputがでてきた
\ ②はfor文のことで,③はif文のことです
\
★代入する演算子
様々な計算を意味する演算子と呼ばれる記号があります
ここでは代入演算子 (assignment operator アサインメント オペレータ)といって
変数に入っている数に対して加減乗除して,その結果を変数に入れ直します
=も代入演算子で,演算は「代入する」でしたね
| 演算 | 記号 |
|---|---|
| 代入する | = |
| 足し算して代入 | += |
| 引き算して代入 | -= |
| かけ算して代入 | *= |
| 割り算して代入 | /= |
\
上で説明したプログラムをコードセルに書いていきますが,\ \ sum = 0\ \ for n in range(1,11):\ sum += n\ \ print(sum)\ \ sum += nがインデント(字下げ)してますか?\ 順番に自分で書いて,実行▶
こう書いても大丈夫ですが,1~100となると大変です
sum = 0
for n in 1,2,3,4,5,6,7,8,9,10:\ sum += n
print(sum)
Q?
「1から10までの和を計算する」関数をつくってみましょう。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上でつくった「1から10までの和を計算するプログラム」関数に変えるだけです。
上のプログラムは,
sum = 0
for n in range(1,11):
sum += n
print(sum)
でした。
関数をつくる=定義するには,defを使います
def sum(n):
続く3行は上のコードと同じで,最後に関数は値を返すのでreturnを使います。
sum = 0
for n in range(1,11):
sum += n
return(sum)
この関数を実行する(呼び出す)には
sum(10)
#sample
def sum(n):
sum = 0
for n in range(1, 11):
sum += n
return sum
sum(10)
55
Q?
1から10までの積を計算
1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
1から10までの積を表す記号は,10!と書きます
!は通常「ビックリマーク」といいますが,正式名はfactorial(ファクトリアル)だと
\ 10!= 362880
です
あまり関係ないけど,
4! + 0! + 5! + 8! + 5! の計算結果は
40585
となります
\
Q?
「1から10までの積を計算する」プログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー\ このプログラムの方が和の場合よりプログラムにする威力を感じるかも
\ やり方は和の場合と同じで,積は英語でproduct(プロダクト)というので,
productという積の箱(変数)をつくり,
はじめは1にしておく(0ではありません)
\ 名前はproductでなくても,pでもxでもいいから自分で決める
sumの場合とは違い,0にしない理由は考えてね
\ 今度はかけ算なので,代入演算子は *= を使う
「productという箱に入っている数にnをかけて,できる積をまたproductに入れる」
ことなので,productという箱の文字は同じで,箱の中に入っている数は変わっていく(だから変数)
\ product = 1\ \ for n in range(1,11):\ product *= n
print(product)
Q?
正の整数nをインプットすると,n!を計算して返す関数のプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
関数を定義するdefを使い,関数名は階乗を意味するfactorial(),引数をnとします
def factorial(n):
n !を計算するコードは上のコードとほとんど同じです。
\ かけ算ですので,順番が逆になっても積は同じなので,range(1, n+1)でもいいですが,
nから1までを表すコードに直して,range(n, 0, -1)とします。
\ range(start, stop, step)で表し,startははじめの数,stopは最後の数の1つ前,
stepは階差を表します。
\ range(n, 0, -1)は,「nから1まで,1ずつ減らす(-1ずつ増やす)」を意味します。
\ 処理するコードは,
product = 1
for i in range(n, 0, -1):
product *= i
return(product)
Q?
英単語のHello(ハロー)のつづりの一文字ごと取り出して文字と文字を,(カンマ)で区切って
表示させるプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「一文字ずつ取り出す」という操作もfor文が使えます
文字列にも使えますので,一文字ずつxに入れて繰り返し取り出し,printで出力
,で区切るので,end=','を入れます
print()も繰り返し操作の中に入るので,インデントします
for x in "Hello":
print(x, end=',')
,の後に間隔を入れたいときは,end=', 'とスペースを入れる
\
Q?
7,10,13,16,19,22,25,28,31,34 の数列をつくるプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
この数列は,はじめが7で,等差が3の等差数列で,10個並んでいる
ご承知のように,5番目の19は,7 + 3 $\times$ (5 - 1)となるから,
n番目の数は, 7 + 3 $\times$ (n - 1) と表せますね
\ range(1,11):とすることで,nに1から10まで入れて
そのnを順番に,7 + 3 * (n - 1) の式で計算していく
というプログラム
\ for n in range(1,11):
print(7 + 3 * (n - 1), end=', ')
\ end=', 'をつけるとprintするたびに改行せず,数字の後に,カンマがつきます
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Pythonではnを0から動かし,下のように書くことが多いですがどちらでも
for n in range(0, 10):
print(7 + 3 * n), end=', ')
\ さらに,0から動かす場合は,0を省略して
for n in range(10):
と書けます
Q?
4 + 16 + 64 + 256 + 1024 + 4096 + 16384
を計算するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
並んでいる数は,はじめは4を1回,次に4を2回,次に4を3回,・・・,
最後に4を7回かけた数だから
順番の数をnとして,nが1から7までで,4**nを繰り返す
\ s = 0
for n in range(1, 8):
s += 4**n
print(s)
Q?
5,4,3,2,1とカウントダウンし,最後に「おめでとう!」を表示するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
countdownという変数を決めて,その変数にin の後の
5, 4, 3, 2, 1, "おめでとう!"を順番に入れて,
そのつどprintで表示させる
というプログラムになります。
\ 変数には数字だけでなく文字も入れられましたね
\ for文は,for 変数 in 順番のリスト :から,インデント(字下げ)された
「何かをする部分」までです。
ここではprintするまでを1セットとして繰り返し(反復)処理をするので,printも
インデントの中に入っています。
\ コードは \ for countdown in 5, 4, 3, 2, 1, "おめでとう!":
print(countdown)
\
Q?
1,1,2,3,5,8,13,21,34, 55 の数列をつくるプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
算数の問題でも出てくるご存知のフィボナッチの数列というやつ
3番目=1番目+2番目,4番目=2番目+3番目,・・・と並んでいる
\ 変数の決め方に注意が必要
\ a = 0
b = 1
for i in range(0,10):
print(b)
a, b = b, a + b
\ 1,2行は,a, b = 0, 1 とも書けます
\ 最後の行(a, b = b, a + b)は変数の入れ替え(swap/スワップ)と言って,
bの数をaに入れて,a + bの数をbに入れるという操作(oeprationオペレーション)を同時にやります
\ a = b
b = a + b
と書くと,式の順番に処理されますが,a, b = b, a + bは一度に処理されるので,
計算結果が違うことに注意です
\ print(b)をprint(b, end=', ')とすると,改行されずに数字の後に,と半角スペースがつく
Q?
n番目のフィボナッチ(Fibonacci)数を出力する関数は?
\ また,その関数を使ってn番目までのフィボナッチ数を全部出力する関数は?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
関数の仕組みは上でつくったコードをそのまま利用できます。
関数は計算結果を「返す」のでreturnを使う点が違うところです。
関数名をFibo,引数をnとして,関数の定義をつくります。
def Fibo(n):
処理内容は上と同じです。
a = 0
b = 1
for i in range(n):
a, b = b, a + b
return b
コードを書いて100番目のフィボナッチ数を実行する(=呼び出す)には,
Fibo(100)
\ 数列を出力するコードもすでにやりました。
次のfor文で使う変数はjとします。
for j in range(0, 100):
print(Fibo(j), end=', ')
この部分は,リストの内包表記を使うと以下のようになります。
print([Fibo(j) for j in range(100)])
#sample
def Fibo(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return b #print(b) is OK
print([Fibo(j) for j in range(100)])
Fibo(100)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, 2971215073, 4807526976, 7778742049, 12586269025, 20365011074, 32951280099, 53316291173, 86267571272, 139583862445, 225851433717, 365435296162, 591286729879, 956722026041, 1548008755920, 2504730781961, 4052739537881, 6557470319842, 10610209857723, 17167680177565, 27777890035288, 44945570212853, 72723460248141, 117669030460994, 190392490709135, 308061521170129, 498454011879264, 806515533049393, 1304969544928657, 2111485077978050, 3416454622906707, 5527939700884757, 8944394323791464, 14472334024676221, 23416728348467685, 37889062373143906, 61305790721611591, 99194853094755497, 160500643816367088, 259695496911122585, 420196140727489673, 679891637638612258, 1100087778366101931, 1779979416004714189, 2880067194370816120, 4660046610375530309, 7540113804746346429, 12200160415121876738, 19740274219868223167, 31940434634990099905, 51680708854858323072, 83621143489848422977, 135301852344706746049, 218922995834555169026, 354224848179261915075]
リストはinputの練習でちょっと出てきた辞書とおなじ数や文字などの
データを入れる箱のことです。
(正しくは「データ構造」というみたいです)
中に入っている1つ1つのデータを要素(ようそ)(elementエレメント)といいます。
for文のなかでよく出てくるので知っておきましょう。
\ いくつかの値(数や文字など)を,(カンマ)で区切って並べて,
それを [ ]カギカッコ で囲んだものをリスト・list と言います。
要素は,(カンマ)で区切る,とカッコは [ ]カッコ」は大切
\ リストも変数に入れることができて,よく変数に入れて使いますが,
基本的には1つの数や変数と同じあつかい
\ リストに関する詳しい説明は → Pythonプログラミング入門/リスト
\
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
10, 3, 8, 2, 6がこの順番で入っているリストを出力表示する場合
[10, 3, 8, 2, 6]
でも
print([10, 3, 8, 2, 6])
でも
mylist = [10, 3, 8, 2, 6]
print(mylist)
でもOKです
\ ちなみにリストの名前・変数名ではlistは使わない
mylistとかlist1とかliとかにしておく
下のセルで出力してみましょう
#sample
[10, 3, 8, 2, 6]
[10, 3, 8, 2, 6]
Q?
145, 3, 25, "かき", 4*7 をリストにして,順番にprintするプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
リストを入れる変数をiroiroとすると,5つの要素(値)をiroiroに入れるコードは
iroiro = [145, 3, 25, "かき", 4 * 7]
\ 順番に取り出すのはfor文を使って,
for i in iroiro:
print(i)
\ 4 * 7は計算結果が出力されます
Q?
1~100の数をリストにしてprintするプログラムコードは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
プログラムのイメージは
「はじめにカラのリストをつくり,そこに1から順番に100までの数を入れていってリストをつくり
そのリストをPrintする」
です
\ はじめにカラのリストをつくるコードは
list1 = []
リストの名前を自分できめて,リストである大かっこ・カギカッコ[]で中には何もいれません
\ for文で「1から順番に100までの数」を取り出す
\ 取り出した数をリストに入れるコードは
for i in range(1,101):
list1.append(i)
です
\ リストに要素を入れて(追加して)いくにはappend(要素)プログラム・関数を使い,
リスト名の後に,.append(要素)と書きます
.(ドット・点)を忘れないようにしましょう
追加された要素はリストの末尾(一番後ろ)に加わります
中身の要素には0から始まる番号(=index/インデックス・添え字)がつけられます
1番目の要素は1ではなく0,2番目は1,3番目は2,・・・・となることに注意
(番号は見えません)
\ for文が終わったら,
print(list1)
でリストをprint
リスト作成と操作の練習です
Q?
次の表示・操作するコードは?
\ 1,3,5,7,xyzを要素とするlist1をつくり,listを出力表示する
listの中の1だけを表示
listの中の5とxyzだけを表示
3を10に入れかえる
入れかえた後のリストを表示
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
リストの中の1番目の要素は,リスト名[0]で指定します
3番目の要素だったら,リスト名[2]です
要素の「入れ替え」は,入れ替えたい要素に新しい数を代入すると上書きされます
#sample
list1 = [1, 3, 5 ,7, "xyz"] #文字は ' ' か " "" で囲む
print(list1)
print(list1[0])
print(list1[2], list1[4])
list1[1] = 10
print(list1)
次は,「要素が含まれているか」の確認,要素の追加,要素の削除 です
Q?
次の表示・操作するコードは?
\ a,b,cを要素とするMylistをつくり,Mylistを出力表示する
Mylistにbが含まれているかを表示
Mylistにdが含まれているかを表示
Mylistにdを追加
Mylistからaを取り除く(削除)
最後のリストを表示
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
bが含まれているかどうかの確認は,inを使います
inは「~の中に」という意味の前置詞ですが,Pythonでは比較演算子に分類されます
\ コードは,"b" in Mylist (あるいはprint("b" in Mylist))
入っているときは,True
入っていないときは,False
と表示されます
\ True=「本当,真実,正しい」という意味の英語ですが,ここでははいというような意味です
False=「嘘,間違い,誤った」という意味の英語ですが,ここではいいえというような意味です
TrueとFalseはPythonの中でも一番単純なデータ型で,この2つしかありません
整数に変換すると,Trueは1,Falseは0になります
\ リストに要素を追加(入れ替えではなく)するには,(リスト名).append(要素)を使います
appendは「追加する」という英語です
追加された要素はリストの最後の要素になります
\ リストから要素を取り除く(削除する)には,(リスト名).remove(要素)を使います
removeは「取り除く」という英語です
★比較する演算子
大きさなどの比較をする記号として
比較演算子 (comparison operator) (コンパリソン オペレータ)があります
これからよく見かけるようになります
\
| 意味 | 演算子 |
|---|---|
| 等しい | == |
| 等しくない | != |
| より小さい | < |
| 以下 | <= |
| より大きい | > |
| 以上 | >= |
| 要素になっている | in |
| 要素になっていない | not in |
\
#リスト (要素の追加・削除)
Mylist = ["a", "b", "c"]
print(Mylist)
print("b" in Mylist)
print("d" in Mylist)
Mylist.append("d")
print(Mylist)
Mylist.remove("a")
print(Mylist)
#上の説明のTrueとFalse
print(int(True))
print(int(False))
#リスト追加サンプル
mylist=[] #空リストをつくり,
mylist.append("addition") #addition = 足し算・アディション add,plus = 足す
print(mylist)
mylist.append("subtraction") #substruction = 引き算・サブストラクション subtract,minus = 引く
print(mylist)
mylist.append("multiplication") #multiplication = かけ算・マルティプリケーション multiple,times = かける
print(mylist)
mylist.append("division") #division = 割り算・ディヴィジョン divide = 割る
print(mylist)
Q?
「ABC」と「イロハ」と「#&%」の文字列の並べ方を全部表示させるプログラムは?
3文字ずつが1セットです
forループを利用して組み合わせをつくります
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「ABC」と「イロハ」と「#&%」の文字列をリストIstring`(ストリング=文字列の英語)に入れる
string = ["ABC", "イロハ", "#&%"]
3つの文字列を使ってできるすべての組み合わせをforループを使って作成
\ リストstringから文字列を取り出し,変数x,y,zに入れて組み合わせをつくる
この場合の変数の名前も自分で適当に決めましょう
for x in string:
for y in string:
for z in string:
x, y, zに入っている文字列が全部違う場合が,求める文字列の並べ方なので,
文字列を結合する(つなげる)+を使って出力
if x != y and x != z and y != z:
print(x + y + z)
コードを書くときはインデントに注意してください
\
#sample
string = ["ABC", "イロハ", "#&%"]
for x in string:
for y in string:
for z in string:
if x != y and x != z and y != z:
print(x + y + z)
Q?
6,2,6,7,1,9を要素とするリストlist1を作り,
昇順並べ替えと降順並べ替えを表示させるプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
リストの要素を並べ替えるには,sorted(リスト名)を使います
\ 数字は昇順(しょうじゅん,小さい順)に並べ替えられます
sorted(リスト名, reverse=True)にすると,降順(こうじゅん,大きい順)になります
reverse=「逆,反対」の英語です
\ 英文字は,アルファベット順になります
1つのリスト内に数字と英文字がある場合はerrorエラーになります
\ 日本語については,??? です。
#sample
list1 =[6, 2, 6, 7, 1, 9]
print(sorted(list1))
print(sorted(list1, reverse=True))
list2 =["a","x","d"]
print(sorted(list2))
print(sorted(list2, reverse=True))
list3 =["昨日","今日","明日"]
print(sorted(list3))
print(sorted(list3, reverse=True))
#数字と文字は一緒にできない
list4 = [ 1, 2, 'b']
print(sorted(list4))
print(sorted(list4, reverse=True))
Q?
3つの数を入力すると,小さい順に並び変えて表示するプログラムは?
\ はじめに3つの数をそれぞれinputしてもらいます
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
はじめに3つの数をそれぞれinputしてもらうので,
print('3つの異なる数を入れて下さい')
と表示し,
a = int(input('aに整数を入れて下さい:a ='))
b = int(input('bに整数を入れて下さい:b ='))
c = int(input('cに整数を入れて下さい:c ='))
で入力してもらう
(別の入力方法は下で紹介)
\ a, b, cをnumbersに入れて,小さい順に数を並べ替えるsorted()組み込み関数を使って
並べかえてnumbersに入れ直して出力
(別の新しいリストnumbers_sortedとかに入れてもOKですが)
numbers = [] #一応はじめに空リストにしておく
numbers += [a, b, c]
numbers = sorted(numbers)
print(numbers)
sorted()関数はリストの並べ替えをする関数なので,a, b, cもリストに入れる
sortedやリストの操作に関しての参考 → Python早見帳/リスト
\ inputを使った別の入力方法の参考
a, b, c = (int(x) for x in input('3つの数をスペースを入れて入力して下さい:').split())
input()で3つの数が入力されと,最後に書いてある.split()で分割されて,
for文でそれぞれの数がint(x)に入り,整数になります
このような書き方も,Pythonのコード作成をやっていくうちに覚えていきますので,
今は,はじめの書き方でいいです
#sample
print('3つの異なる数を入れて下さい')
a = int(input('aに整数を入れて下さい:a ='))
b = int(input('bに整数を入れて下さい:b ='))
c = int(input('cに整数を入れて下さい:c ='))
numbers = []
numbers += [a, b, c]
numbers = sorted(numbers)
print(numbers)
#sample2
a, b, c = (int(x) for x in input('3つの異なる数をスペースを入れて入力して下さい:').split())
numbers = []
numbers += [a, b, c]
numbers = sorted(numbers)
print(numbers)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
入力されたa, b, cに同じ数が入っていたときは,if文を使って場合分けして
入力し直してもらうプログラムにするなど,
自分でも条件をつくってプログラムをつくるのもおすすめです
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上で見てきたリストは
list1 = [1, 2, 3]
という一列のものでしたがこれが1次元リストです
\ 2次元リストというのはわかりやすく言えば下のような表のことと理解しておきましょう
この表をリストで表すと
list2 = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
となります
forを使って1次元リストをつくるときは
まず何も入っていない空(から)のリストをつくり,その中にforを使って1つずつ数を入れていきます
リストに数を入れるのは(リスト名).append()でしたね
list1 = []
for A in range(1,4): #alphabetアルファベットは大文字も変数にできます
list1.append(A)
print(list1)
#1次元リスト
list1 = []
for A in range(1,4):
list1.append(A)
print(list1)
[1, 2, 3]
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
forを使って2次元リストをつくるためにforの2重ループを利用します
あとの方でNumpyという別のプログラムを利用する方法も使うこともあるかもしれませんが
forの2重ループをここでもう一度確認
\ 出来上がりはこれでしたね
list2 = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
\ はじめに2次元リスト用の空リストをつくります
list2 = []
\ list2の中にはリストが3つ入っていて,それぞれのリストの1番目の要素は1,4,7なので,
その3つを取り出すコードは,変数をAとして,順番に1次元用空リストlist1に入れていくと,[1], [4], [7]というリストができます
for A in range(1,8,3):
list1 = []
\ range(1,8,3)は1から7まで3つおきという意味です
この表現もこれから使うかもしれないので,今回はこれにしますが,
この場合だったらふつうはfor A in [1,4,7]でしょうか
\ 取り出す変数をBとして,その各リストにそれぞれ0,1,2を足した数をappendしていきます
for B in range(0,3): #ここでも for B in [0,1,2]:で十分でしょうが
list1.append(A+B)
たとえば[4]だったリストが→[4, 5]→[4, 5, 6]とつくられていきます
\ 1つの1次元リストlist1ができたら,それを2次元リストlist2にappendするので
list2.append(list1)
このコードは1重ループ内の処理になるのでインデントに注意です
最後にlist2をprint
print(list2)
#1次元リスト
list1 = []
for A in range(1,4):
list1.append(A)
print(list1)
#2次元リスト
list2 = []
for A in range(1, 8, 3):
list1 = []
for B in range(0, 3):
list1.append(A + B)
print(list1) #このコードを入れておくとリストがどのように作られていくかを確認できます
list2.append(list1)
print(list2)
上のように途中でprint()を入れておくと,プログラムの進行状況がわかりますので
どうなっているのかを確認したいときはぜひおススメです
次のは,2次元リスト[[11, 12], [21, 22], [31, 32]]をつくるサンプルコードです
#sample
list2 = []
for i in range(1, 4):
list1 = []
for j in range(1, 3):
list1.append(i * 10 + j)
list2.append(list1)
print(list2)
Q?\ 1~10000の数の中で13の倍数を全部書き出しましょう
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「13の倍数=13で割ると余りが0の数」
と考えて,
「1から10000までの数を,1から順番に13で割って,余りが0となる数をprintする」
というプログラムをつくる
\ 「1から10000までの数を順に取り出す」コードは,
for i in range(1,10001):
forで数などを取り出すために使う変数としてiをよく使うみたいですが,
これはiterable(イテラブル=繰り返し可能という意味)の頭文字らしいです
\ for文では,最後に:をつけること,下の(操作内容)を表す文ではindent(インデント=字下げ)
を忘れないようにしましょう
\ for文は
for 変数 in range():
(操作内容)
というコードでひとまとまりを表すためにインデントします
\ 「取り出した数を13で割って,もし,余りが0ならばその数をprintする」コードは
if i % 13 == 0:
print(i, end = ', ')
\ %は余りを求める算術演算子で,
==は比較演算子(ひかくえんざんし)といって,意味は算数の=(イコール)と同じです
Pythonでは,=が「代入する」という意味で,==が「等しい」という意味
下のセルでほかの比較演算子もありますが,これからよく出てくるので今覚える必要はないです
\ print(i)でもOKですが,そうすうるとprintされるたびに改行されて,
たてに1つずつprintされます
end = ', 'をつけると,改行されずに,数の後に,(カンマ)と半角スペースがつきます
end = ','は半角スペースがつきませんのでお好みで
\ if文でも最後の:とindentを忘れないようにしましょう
\ if文は
if (条件) :
(操作内容)
というコードでひとまとまりを表すためにインデントします
\ こうしてみると,
「if文のひとまとまりがfor文のひとまとまりの中にあって,全体がひとまとまりになっている」
というめんどくさいことになっていますが,この仕組みはこれから死ぬほど出てきますので
じょじょに慣れていきます
プログラミングも算数と同じで「要は頭の慣れ」ですのでちょっとがまんです
\ コードをまとめると
for i in range(1,10001):
if i % 13 == 0:
print(i, end = ', ')
★比較する演算子
大きさなどの比較をする記号として\ 比較演算子 (comparison operator) (コンパリソン オペレータ)があります \ これからよく見かけるようになります
| 意味 | 演算子 |
|---|---|
| 等しい | == |
| 等しくない | != |
| より小さい | < |
| 以下 | <= |
| より大きい | > |
| 以上 | >= |
| 要素になっている | in |
| 要素になっていない | not in |
\
別の方法としては,\ 「13の倍数=13for i in range(1,1001):\ \ 「取り出した数を13をかけた数が10000以下をprintする」コードは\ if 13 * i <= 10000:\ print(13 * i, end = ', ')\ \ 以上をまとめると,\ for i in range(1,1001):\ if 13 * i <= 10000:\ print(13 * i, end = ', ')
これでもOKですが,このプログラムは,range(1,1001):としているので,
iが769まで(10000÷13=769…3)でよいのに,10000まで進んでから終了します
そこで,
「13 * iが10000をこえたらプログラム終了(中断する)とする」コードを入れます
if 13 * i > 10000:
break
if文の最後の:を忘れずに
比較演算子>は下で確認
プログラムを中断させるにはbreak(ブレイク=中断する,こわす,割るなど)を使います
Have a break.=休憩しよう(このbreakは名詞)
breakはfor文でよく使うのでここで使い方を紹介
if文が2回出てきて,算数でやる「場合分け」と同じです
以上をまとめると
for i in range(1,1001):
if 13 * i <= 10000:
print(13 * i, end = ', ')
if 13 * i > 10000:
break
★算術演算子まとめ
\
| 演算 | 記号 |
|---|---|
| 足し算 | + |
| 引き算 | - |
| かけ算 | * |
| 割り算 | / |
| べき乗 | ** |
| 割り算(商だけ) | // |
| 割り算(余りだけ) | % |
\
Q?\ 1~10000の数の中で13の倍数を全部書き出せたんですが,全部で何個あったでしょう?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
この問題は「1~10000の中に13の倍数は何個ありますか」という算数の問題で
この答えは,上のセルでも計算した
10000÷13=769…3 より769個と簡単にわかりますが
プログラムでやってみます
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「1から10000までの数で,13で割った余りが0になる数だったら数える(カウントする)」
というプログラムになります
\ まず,「個数をカウントする変数をcount(カウント)として,はじめは0とする」コードは
count = 0
\ 「1から10000までの数を順に取り出す」コードは,
for a in range(1,10001):
iをaにした理由はとくにないです
\ 「取り出した数を13で割って,もし,余りが0ならばcountに1をたす」コードは
if a % 13 == 0:
count += 1
この2行がif文ひとまとまりなので,2行目のcount += 1はインデント
%は算術演算子で,代入演算子+=は下で確認
\ 「最後まで計算したら,最後にcountをprintでxx個と表示させる」コードは
print(count, '個')
\ ここでは最後のprintは,forによる繰り返し処理が終わってからになるのでインデントなし
なことに注意です
\ for文が終わったらprintするという順番処理→下の<Check it Out➀>確認
一番初めにcount = 0としておかないといけない理由も同じです
\ print(count)でもいいですが,「個」をつけたい場合は上のコードで
ここでもfor文の中にif文というパターンなので,2段階インデント
\ 以上をまとめると
count = 0
for a in range(1,10001):
if a % 13 == 0:
count += 1
print(count, '個')
★代入演算子まとめ
足し算して代入: sum = sum + x → sum += x\ かけ算して代入: product = product * x → product *= x
| 演算 | 記号 |
|---|---|
| 足し算して代入 | += |
| 引き算して代入 | -= |
| かけ算して代入 | *= |
| 割り算して代入 | /= |
\
<Check it Out>
コンピュータがプログラムを読んで動く(計算する)とき
その動き方は3種類しかない
コンピュータはそれくらいシンプルですね
\ ➀プログラムが書かれた(上から下へ)順番に動く
②繰り返し動く
③条件で動きが分かれる(条件分岐・じょうけんぶんき)
\ 上でやったプログラムでは➀と②で動いてoutputがでてきた
③は算数で言う「場合分け」ということで,これからたくさん出てきます
\ ②はfor文のことで,③はif文のことです
Q?
西暦を入力すると,”うるう年”かどうかを判定するプログラムは?
\ うるう年は2月が29日まである年ですね
\ 現在私たちが使っている暦は「グレゴリオ暦」というそうです
これは世界中の国で使われているようです
ほかにどんな暦があるのかは知りませんが,このグレゴリオ暦法では
うるう年を次のように決めています。
\ ➀ 西暦年号が4で割り切れる年をうるう年とする
② ➀の例外として,西暦年号が100で割り切れて400で割り切れない年は平年とする
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー\ ➀,②からすると,うるう年というのは
「4で割り切れて100で割り切れない年か,400で割り切れる年」のことと考えられます
これをもとにコードを考えます
\ まず
print('うるう年か平年かを判定します')
と表示させてから
\ 「西暦をを入れてもらう」コードは
year = int(input('西暦を入れて下さい:')) #year(イヤ-=年という英語)
\ もしyearが,4で割り切れて100で割り切れない数か,400で割り切れる数であれば
「うるう年です」とprint,そうでなければ「平年です」とprintするコードは
if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):
print(year, '年はうるう年です')
else:
print(year, '年は平年です')
\ ここで出てきたandやorは論理演算子(ブール演算子)といいますが,
説明は後ほどにしますので,ここではこのようなコードの書き方をすると覚えておいてください
\ if文の中で( )はつけなくても
andとorは処理する優先順位があって,コンピュータは
「y % 4 == 0 and y % 100 != 0」or「y % 400 == 0」
と読んでくれますが,自分の理解のためにも( )をつけています
\ 今回のプログラムでは,うるう年か平年のどちらかで,平年の条件を入れるのは
間違えやすいので,else:がいいです
Q?
西暦2000年から2500年のうち,うるう年のみをすべて表示させるプログラムは?
全部で何回あるかも表示させる
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
前の問題と別の書き方ですが,考え方は同じ
count = 0
for i in range(2000,2501):
if i % 4 == 0:
if i % 100 == 0 and i % 400 != 0:
continue
print("西暦" + str(i) + "年", end=', ')
count += 1
print(count,'回')
#sample
count = 0
for i in range(2000,2501):
if i % 4 == 0:
if i % 100 == 0 and i % 400 != 0:
continue
print("西暦" + str(i) + "年", end=', ')
count += 1
print(count,'回')
これも書き方が違うだけ
count = 0
for year in range(2000,2501):
if year % 4 == 0 and not (year % 100 == 0 and year % 400 != 0):
print("西暦", year, "年")
count += 1
print(count,'回')
Q?
1から30までの数を表示し,3の倍数のときは「3の倍数です」,5の倍数のときは「5の倍数です」,
3と5の倍数のときは「3と5の公倍数です」と表示するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
for文で1から30までの数を順に取り出し
3の倍数=3で割ると余りが0,5の倍数=5で割ると余りが0,3と5の公倍数=15で割ると余りが0,
と考えて,3と5の公倍数,3の倍数,5の倍数,それ以外
の順でif文で場合分けしていく
\ この条件の並べ方(順序)が大切です
この問題を解くためのコードは次のようになります
\ for n in range(1,31):
if n % 3 == 0 and n % 5 == 0:
print(n, " : 3と5の公倍数です")
elif n % 3 == 0:
print(n, " : 3の倍数です")
elif n % 5 == 0:
print(n, " : 5の倍数です")
else:
print(n)
\ まず意識しないといけないことは,コンピュータはプログラムが書かれた順番に計算処理します
これが上で書いた条件文の順序が大切な理由です
下の<Check it Out>で確認
\ 次に,elifは「上に書かれた条件をみたされない場合だけ計算」という意味です
いいかえれば,elifは上に書かれた条件がみたされたときは計算されません
\ 何のことかよくわかないので具体的な数でいいますと,
15は3の倍数,5の倍数,15の倍数ですので,上のコードでelifではなくifにしてしまうと
15:3と5の公倍数です
15 : 3の倍数です
15:5の倍数です
と3回登場してしまいます
\ また,コードを
for n in range(1,31):
if n % 3 == 0:
print(n, " : 3の倍数です")
elif n % 3 == 0 and n % 5 == 0:
print(n, " : 3と5の公倍数です")
elif n % 5 == 0:
print(n, " : 5の倍数です")
else:
print(n)
とすると,
15:3の倍数です
と表示されてしまいます
\ 15は上のifで計算されているので,elifの条件をみたしていても計算されないです
下のコードセルを実行▶してみてどのように表示されるかを必ず確認してみましょう
\ イメージで言うと,
集合のベン図で下のように集合Aと集合Bの重なり(ダブり)がある場合での場合分け(条件分岐)では
elif,elseの利用が大切になってきます
ダブりの条件から先に計算するのがポイントです
問題によりますが,むしろこのような条件分岐が多いのではないでしょうか
#正解
for n in range(1,31):
if n % 3 == 0 and n % 5 == 0:
print(n, " : 3と5の公倍数です")
elif n % 3 == 0:
print(n, " : 3の倍数です")
elif n % 5 == 0:
print(n, " : 5の倍数です")
else:
print(n)
#同じ数が何度も出てくる
for n in range(1,31):
if n % 3 == 0 and n % 5 == 0: #if num % 15 == 0: でもよい
print(str(n)+" : 3と5の公倍数です")
if n % 3 == 0:
print(str(n)+" : 3の倍数です")
if n % 5 == 0:
print(str(n)+" : 5の倍数です")
else:
print(str(n))
#15や30が「3と50の公倍数」ではなく「3の倍数」の表示になってしまう
for n in range(1,31):
if n % 3 == 0:
print(n, " : 3の倍数です")
elif n % 5 == 0:
print(n, " : 5の倍数です")
elif n % 3 == 0 and n % 5 == 0:
print(n, " : 3と5の公倍数です")
else:
print(n)
<Check it Out>
コンピュータがプログラムを読んで動く(計算する)とき
その動き方は3種類しかない
コンピュータはそれくらいシンプルなんですね
\ ➀プログラムが書かれた(上から下へ)順番に動く←上でこの点を強調しました
②繰り返し動く
③条件で動きが分かれる(条件分岐・じょうけんぶんき)
\ ②はfor文のことで,③はif文のことです
★比較する演算子
大きさなどの比較をする記号として
比較演算子 (comparison operator) (コンパリソン オペレータ)があります
これからよく見かけるようになります
\
| 意味 | 演算子 |
|---|---|
| 等しい | == |
| 等しくない | != |
| より小さい | < |
| 以下 | <= |
| より大きい | > |
| 以上 | >= |
| 要素になっている | in |
| 要素になっていない | not in |
\
Q?
次の問題は,「FizzBuzz問題」といって,有名な問題みたいです
\ 1から100までの数字を出力するプログラミングを書いてください。
ただし,数字が3の倍数の時は数字の代わりにFizzと出力し,
5の倍数の時は数字の代わりにBuzzと出力し,
3と5の倍数のときは,FizzBuzzと出力すること。
\ “Write a program that prints the numbers from 1 to 100.
But for multiples of three print “Fizz” instead of the number and
for the multiples of five print “Buzz”.
For numbers which are multiples of both three and five print “FizzBuzz”.”
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上の問題と解法は同じです
#sample
for i in range(1, 101) :
if i % 3 == 0 and i % 5 == 0: #if i % 15 == 0:でもよい
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)
Q?\ 数字(整数)を入力してもらい,それが偶数か奇数かを判定するプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
まず
print('偶数か奇数かを判定します')
と表示させてから
\ 「数字(整数)を入れてもらう」コードは
a = int(input('整数を入れて下さい:'))
\ 「もしaが2で割り切れれば「偶数です」とprint,割り切れなければ「奇数です」とprint」するコードは
if a % 2 == 0:
print('「', a, 'は偶数です」')
else:
print('「', a, 'は奇数です」')
\ ここでは,整数は偶数か奇数しかないので,
「偶数でない場合は」という意味でelse:です
ここではif a % 2 != 0:やif a % 2 == 1:でもOKです
\ %は算術演算子で,余りを求める記号でした(下記算術演算子まとめ)
==は比較演算子で,算数の=(イコール)と同じ意味でした
!=も比較演算子で,「等しくない」という意味で,
if a % 2 != 0:は,「もしaを2で割ったあまりが0でないときは」となります
★算術演算子(さんじゅつえんざんし)まとめ
\
| 演算 | 記号 |
|---|---|
| 足し算 | + |
| 引き算 | - |
| かけ算 | * |
| 割り算 | / |
| べき乗 | ** |
| 割り算(商だけ) | // |
| 割り算(余りだけ) | % |
\
Q?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<算数解法>
分子が5の分数を探すので,
無理して作る
2
だから,分母にも
3
4
だから,分母にも
5
求める分数の分母は6.25より大きく,7.5より小さくなくてはならない
6.25と7.5の間にある整数は7だから,
<Python>
「分子が5で分母がxの分数は5/xで,xは整数なので,xに整数を順番に入れて,
もし,
というイメージ
\
xを調べる範囲は5から10までの範囲で十分
\ for x in range(5,11):
if 2/3 < 5/x < 4/5:
print(5, "/", x)
\ またfor文とif文の組み合わせパターンでした
<Check it Out>を確認できたのではないでしょうか
\ きれいな分数表示をしたいときはFractionなどを利用してみましょう
その時はfrom fractions import Fractionをお忘れなく
Q?
1~100までの数の中で3の倍数以外の数の合計を求めるプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
コード作成の手順としては,次のようになります
\ はじめに求める合計を入れる箱totalを0に設定
total = 0
forループで1から100までの数を取り出し,
for i in range(1, 101):
取り出した数が3で切れれば何もせずに次にすすみ
if i % 3 == 0:
continue
それ以外,つまり3で割り切れない数をtotalに加えていく
total += i
全部調べ終わったら(forループが終わったら)print()で結果を出力
print(total)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
コードの中でcontinueが出てきましたが,これは
ifの条件にあてはまったときは,何もせずに次の繰り返し処理の数にすすめる
という意味です
この場合だと
もし,iが3で割り切れたら何もしないで,次の数にすすむ
ということになります
for i in range(1, 101):
total += i
がforループの本体で,
if i % 3 == 0:
の場合は何もしないで先にすすむ
というイメージです
\ ちなみにcontinueは「続ける」という英語です
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
#sample
total = 0
for i in range(100):
if i % 3 == 0:
continue
total += i
print(total)
リストの作成必要なった場合の参考です
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ここで参考までに書いたコードでは大きな差が感じられないかもしれませんが,
より複雑なリストになってくると内包表記が威力を発揮します
見やすくエレガントな感じになるとか・・・・・・
\ ここでは内包表記をつくる仕組みだけを確認してください
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
具体的なコードの例ですが
1から10までの数を3倍した数のリストをつくる場合
for文を使って次のようなコードになります
list1 = []
for x in range(1, 11):
list1.append(x * 3)
print(list1)
これを内包表記で表すと次のコードになります
list1 = [x * 3 for x in range(1, 11)]
print(list1)
1から9までの数の中で奇数(odd)だけのリストをつくる場合
odd_list = []
for x in range(1, 10):
if x % 2 == 1:
odd_list.append(x)
print(odd_list)
これを内包表記で書くと
odd_list = [x for x in range(11) if x % 2 == 1]
print(odd_list)
0から20までの数の中で偶数(even)だけのリストをつくる場合
even_list = []
for x in range(21):
if x % 2 == 0:
even_list.append(x)
print(even_list)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
これを内包表記で書くと
even_list = [x for x in range(21) if x % 2 == 0]
print(even_list)
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
以下は参考までに見ておいてください
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
2次元リストから1次元リストをつくる
#<作り方の例>
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = []
for row in matrix:
for x in row:
flat.append(x)
print(flat)
#別の作り方
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flat = [x for row in matrix for x in row]
print(flat)
0や1でできた2次元リスト
a=[[0]*3 for i in range(3)]
a[1][1]=1
print(a)
#注意 上と違う結果 リストの作り方の違いから生まれる
a=[[0]*3]*3
a[1][1]=1
print(a)
集合をつくる内包表記
num = {i*2 for i in range(15)}
print(num)
animal = { i for i in ["ゴリラ", "ライオン", "キリン", "ぞう"] }
print(animal)
2つのリストを結合させる
years = [2000, 2010, 2020]
seasons = ["Spring", "Summer", "Autumn", "Winter"]
lst = [(year, season) for year in years for season in seasons]
for year, season in lst:
print(year, season)
sympyを使った文字と数字がセットの要素になっているリスト
from sympy import *
var("r, b, w, y, p, q")
color_list = [r, b, w, y] ###赤=r,青=b,白=w,黄=y
number_list = [1, 2, 3, 4]
all_list = [[color, number] for color in color_list for number in number_list]
for A in all_list:
print(A)
#print(all_list)
場合の数の問題で内包表記を利用する例
Q?
りんご5個とミカン6個をa,b,cの3つのかごにどのかごにもりんごもミカンも1個以上入れ,
残さずに分ける分け方は何通り?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<算数解法>
5個のりんごを3つに分ける分け方は(1,1,3),(1,2,2)で,これをa,b,cのかごに入れるから
それぞれの分け方の場合で,3通りと3通りで6通り
6個のミカンを3つの分ける分け方は(1,1,4),(1,2,3),(2,2,2)で,これをa,b,cのかごに入れるから
それぞれの分け方の場合で,3通りと3
以上全部で,6
\ <Python>
条件から1つのかごにりんごは3個まで,ミカンは4個まで
1つのかごに入るミカンの個数は,1~4個
1つのかごに入るりんごの個数は,1~3個だが,
見分けるためにりんごの個数は10,20,30とする
orange_list = [1,2,3,4]
apple_list = [10,20,30]
\ 両方の合計個数のリスト(list1)を作るコードは
list1 = []
for x in apple_list:
for y in orange_list:
list1.append(x + y)
これをリストの内包表記で1行で書くと,
list1=[(x + y) for x in apple_list for y in orange_list]
となります
\ 場合の数をカウントするcount = 0とし,
a,b,cに入るりんごとミカンの合計数のすべての場合をlist1からつくり,
count = 0
for a in list1:
for b in list1:
for c in list1:
ミカンの個数の合計は6個だから6で,りんごの個数の合計は5個だから50になるから
全部の合計は56になる場合だけをカウントし,
if a + b + c == 56:
count += 1
最後にカウント数を出力
print(count, "通り")
#sample 内包表記利用
apple_list = [10, 20, 30]
orange_list = [1, 2, 3, 4]
list1 = [(x + y) for x in apple_list for y in orange_list]
count = 0
for a in list1:
for b in list1:
for c in list1:
#print(a,b,c)
if a + b + c == 56:
#print(a,b,c)
count += 1
print(count, "通り")
内包表記を使わない例はいアkのようになります。
#sample 内包表記使わず
orange_list = [1, 2, 3, 4]
apple_list = [10, 20, 30]
list1 = []
for x in apple_list:
for y in orange_list:
list1.append(x + y)
count = 0
for a in list1:
for b in list1:
for c in list1:
#print(a,b,c)
if a + b + c == 56:
#print(a,b,c)
count+=1
print(count, "通り")
繰り返い処理を行うfor ループをやってきましたが,
繰り返し処理を行うもう1つの道具として,while ループがあります。
\ while ループの構造はfor ループと同じで
while (条件文):
繰り返される処理
です。
\ 「(条件文)が満たされている間(真 (True)である間は処理が繰り返される」という仕組みです。
\ ここでは,例をもとにwhile ループのコードがどのようになるかの確認だけにします。
下の例は,「変数numberが10未満の間はnumberを出力し,numberに1をたしていく」
というwhileループです。
number = 0
while number < 10:
print(number)
number += 1
次は,「1から99までを足し上げる」whileループです。
\ 変数iが100未満の間は
➀ 変数totalに変数iをたして,
②iを1ずつ増やす
という2つの処理を繰り返す
という内容になります。
i = 0
total = 0
while i < 100:
total = total + i
i += 1
print(total)
これはforループを使っても同じ結果を得られます。
total = 0
for i in range(100):
total = total + i
print(total)
Q?
1から順に足していき,合計値が10,000を超える最小値は何?
またその時の合計値はいくつ?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
変数totalとxを0に設定し,
totalが10000以下の場合は,
➀ totalにxを足し,
② xを1ずつ増やす
という2つの処理を繰り返します。
#sample
total = 0
x = 0
while total <= 10000:
total += x
x += 1
print("10000を超える最小のxは", x)
print("その時の合計値は", total)
これもforループでxをいくつまでにするかをrange()内で適当に設定し,
breakを利用すれば,同じ内容のコードを書けます。
\ 「いくつまで」の設定が決められない場合などではwhileのほうが役に立ちます。
total = 0
for x in range(1, 200):
total += x
if total > 10000:
break
print("10000を超える最小のxは", x)
print("その時の合計値は", total)
前に出てきた「FizzBuzz」問題をwhileを使って解いてみます。
Q?
1から100までの数字を出力するプログラミングを書いてください。
ただし,数字が3の倍数の時は数字の代わりにFizzと出力し,
5の倍数の時は数字の代わりにBuzzと出力し,
3と5の倍数のときは,FizzBuzzと出力すること。
#whileバージョンsample
i = 1
while i < 101:
if i % 15 == 0:
print("Fizz Buzz!")
elif i % 3 == 0:
print("Fizz!")
elif i % 5 == 0:
print("Buzz!")
else:
print(i)
i += 1
これもfor文で出てきましたが,フィボナッチ数列のプログラムをwhileでやります。
Q?
以下のように前の2つの数を足した数の列をフィボナッチ数列という。
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144 …
この数列を100番目まで表示せよ。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
for文でつくると次のようになりましたね。
#sample
a = 0
b = 1
for i in range(100):
print(b, end=',')
a, b = b, a + b
whileの場合は,カウンタ変数countを使って,whileループの繰り返しの処理
の中で,countを1つずつ増やす処理が加わります
a = 0
b = 1
count = 0
while count < 100:
print(b, end=', ')
a, b = b, a+b
count += 1
「100以下のフィボナッチ数」という問題の場合は,カウンタは不要で,
whileの条件文が
while b < 100:
となります。
a = 0
b = 1
while b < 100:
print(b, end=', ')
a, b = b, a+b
関数の作成は次のようになりました。(リストで作成)
#sample
def Fibo(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return b #print(b) is OK
print([Fibo(j) for j in range(100)])
whileで関数をつくります。
コードは,空リストを作り,それにappend()するところを変更します。
def Fibo(n):
F_list = []
a = 0
b = 1
count = 0
while count < 100:
F_list.append(b)
a, b = b, a+b
count += 1
return F_list
print(Fibo(100))
「100以下のフィボナッチ数」を書き出す関数の場合です。
def fibo(n):
fibo_list = []
a = 0
b = 1
while b < n:
fibo_list.append(b)
a, b = b, a+b
return fibo_list
fibo(100)
関数の再帰呼び出しというのは,
「関数の定義の中で,自分自身の関数を使う(呼び出す)こと」を言います。
再帰呼び出しを行う関数を,再帰関数といいます。
関数がreturnする数(返り値)をもう一度引数とするなど,
返り値と引数の受け渡しの連続を実現するときに使われます。
何のことかよくわからないと思いますので,例で説明します。
\ 再帰関数の定義の書き方には決まりがありますので,この書き方を覚えておきましょう。
def (関数名):
if (再帰呼び出しをしない場合):
return (再帰呼び出しを含まない処理)
else:
(再帰呼び出しを含む処理)
次の関数をつくりましたね。
「1から10までの和を計算する」関数
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
10をnに変えてこのプログラムをもう一度書くと,
def sum(n):
sum = 0
for n in range(1,11):
sum += n
return(sum)
です。
\ この関数を実行する(呼び出す)には
sum(10)#sample
def sum(n):
sum = 0
for n in range(1, 11):
sum += n
return sum
sum(10)
55
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これを再帰関数を使って書き直すと次のようになります。
def sum(n):
if n < 1:
return n
else:
return sum(n-1) + nn = 5の場合を例にこの式を考えます。
n = 5の場合は,1 + 2 + 3 + 4に5をたすので,sum(4) + 5
n = 4の場合は,1 + 2 + 3に4をたすので,sum(3) + 4
n = 3の場合は,1+2に3をたすので,sum(2) + 3
n = 2の場合は,1に2をたすので,sum(1) + 2
n = 1の場合は,0に1をたすので,sum(0) + 1
n = 0の場合は,再帰呼び出しをしないので,0が返ります。
#sample
#else:はなくてもOK
def sum(n):
if n < 1:
return n
return sum(n - 1) + n
sum(10)
55
下の問題をfor文でやりました。
Q?
正の整数nをインプットすると,n!を計算して返す関数のプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
この関数をつくるコードは
(関数名はfactorialの短縮形でfactに,productはpに変えてます。)
def fac(n):
p = 1
for i in range(n, 0, -1):
p *= i
return(p)
def fact(n):
p = 1
for i in range(n, 0, -1):
p *= i
return(p)
fact(5)
これを再帰呼び出しを使ったコードにすると,
def fact(n):
if n == 1:
return 1
else:
return n * fact(n - 1)ここでの考え方も上でやったsumの例と同じです。
n = 1の場合は,再帰呼び出しを含まないので1が返ります。
#sampe
#else:はなくてもOK
def fact(n):
if n == 1:
return 1
return n * fact(n - 1)
fact(5)
フィボナッチ数列10番目までを出力コードは次のようになりますね。
a = 0
b = 1
count = 0
while count < 10:
print(b, end=', ')
a, b = b, a+b
count += 1
n番目までを出力する関数にすると次のようになり,10番目までを表示します。
def fibo(n):
a = 0
b = 1
count = 0
while count < n:
print(b, end=', ')
a, b = b, a+b
count += 1
fibo(10)
1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
n番目を求める関数を再帰関数を使ってつくると次のようになります。
def Fibo(n):
if n < 3:
return 1
return Fibo(n-1) + Fibo(n-2)フィボナッチ数列は,1, 1, 2, 3, 5, 8, 13, 21, 34, 55・・・・と並んでいて,
(3番目:2) = (2番目:1) + (1番目:1)
(4番目:3) = (3番目:2) + (2番目:1)
それぞれの項は,前の2つの項の和になっています。
このことを式で表すと,n番目のフィボナッチ数をFibo(n)として,
Fibo(n) = Fibo(n - 1) + Fibo(n - 2)
nが3より小さい場合は,再帰呼び出しを含まない場合になりますので,1がreturnされます。
def Fibo(n):
if n < 3:
return 1
return Fibo(n-1) + Fibo(n-2)
print(Fibo(5))
n番目までを出力する関数にすると次のようになり,10番目までを表示します。
def Fibo(n):
if n < 3:
return 1
return Fibo(n-1) + Fibo(n-2)
for i in range(10):
print(Fibo(i+1), end=', ')
1, 1, 2, 3, 5, 8, 13, 21, 34, 55,
<約束記号>
aは0でない整数,nとxは整数とします。
xがaでn回割り切れるが,n+1回では割り切れないとき,
<x, a> = n
と書くことにします。たとえば,
<12, 2>のとき
1回目 12÷2=6 ・・・・・・・・・割り切れる
2回目 6÷2=3 ・・・・・・・・・・割り切れる
3回目 3÷2=1あまり1 ・・・・・・割り切れない
なので,<12, 2>= 2となります。
このとき,次の問いに答えなさい。
(1) <360, 2>を求めなさい。
(2) <3888, a>= 2と<3240, a>= 2が同時に成り立つような最大の整数aを求めなさい。
(3)<x, 2> = 2と<x, 3>= 5 が同時に成り立つような4ケタの整数xをすべて求めなさい。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<答>
(1) 3
(2) 18
(3) 4860, 6804
\
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
下のセルのように,while文やfor文で解いてみましたが,みなさんもどんな解き方があるか
考えてみて下さい。
#(1)
n = 1
while True:
if (360 % 2**n == 0) and (360 % 2**(n+1) !=0):
print(n)
break
else:
n +=1
#(2)
num = []
for a in range(1,100):
if ((3888 % a**2 == 0) and (3888 % a**3 != 0)) and ((3240 % a**2 == 0) and (3240 % a**3 != 0)) :
num.append(a)
print(max(num))
#(3)
num = []
for x in range(1000, 10000):
if ((x % 2**2 == 0) and (x % 2**3 != 0)) and ((x % 3**5 == 0) and (x % 3**6 != 0)) :
num.append(x)
print(num)
Q?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<算数の解法>
求める分数を
bは15と25の倍数で,最も小さい分数をもとめることから,bは15と25の最小公倍数=75
\ aは約分されて1になることから,aは88と144の約数で,分数をできるだけ小さくするためには
aはできるだけ大きな数となることから,aは88と144の最大公約数=8
よって
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<Python>
イメージとしては,
「求める分数を
(全部で100
\ 分数計算をするので,はじめにFractionをimport(from fractions import Fraction)
\ 上でつくるsに入れておく,
(s = Fraction(100,1))
\ 上の条件にあてはまる分数が見つかったときは,そのつど上書きしていく(下で説明)
\
for a in range(1,101):
for b in range(1,101):
と,for文をダブルにする
この方法はこれからよく出てくるので覚えておきましょう
\
sよりも小さいことが条件
if (Fraction(b,a)*Fraction(88,15))%1==0 and (Fraction(b,a)*Fraction(144,25))%1==0 and s > Fraction(b,a):
\ andは論理演算子の1つで,このif文では3つの条件がandでつながっているので,
3つの条件が全部そろったFraction(b,a)だけが選ばれる。
下の「論理演算子まとめ」で確認
\
この条件にあてはまったFraction(b,a)をsに入れると,前に入っていたFraction(b,a)に上書きされる
s = Fraction(b,a)
全部の分数を調べ終わったところで,sに入っている分数をprint
print(s)
s とすると,Fraction(75,8)と表示されます
\
「積が整数になる」という条件にあてはまる分数が見つかった場合は,sを入れ替えていく。
\ bは15と25の倍数で,最も小さい分数をもとめることから,bは15と25の最小公倍数=75
\ aは約分されて1になることから,aは88と144の約数で,分数をできるだけ小さくするためには
aはできるだけ大きな数となることから,aは88と144の最大公約数=8
\ よって
#sample
from fractions import Fraction
s = Fraction(50, 1)
for a in range(1, 100) :
for b in range(1, 100) :
if (Fraction(b, a) * Fraction(88, 15)) % 1 == 0 and (Fraction(b, a) * Fraction(144, 25) )% 1 == 0 and s > Fraction(b, a) :
#print(Fraction(b, a)) #このprint()は入れなくてもいいんですが,入れておくと他にどんな分数があるか確認できます
s = Fraction(b, a)
print(s)
#ifの条件文の中で区切りたいときは \ (バックスラッシュ)をつける書き方
from fractions import Fraction
s = Fraction(50,1)
for a in range(1, 100) :
for b in range(1, 100) :
if (Fraction(b, a) * Fraction(88, 15)) % 1 == 0 and \
(Fraction(b, a) * Fraction(144, 25)) % 1 == 0 and \
s > Fraction(b, a):
s = Fraction(b, a)
print(s)
#ifの条件文のはじめと終わりに( )をつける書き方
from fractions import Fraction
s = Fraction(50, 1)
for a in range(1, 100) :
for b in range(1, 100) :
if ((Fraction(b, a) * Fraction(88, 15)) % 1 == 0
and (Fraction(b, a) * Fraction(144, 25)) % 1 == 0
and s > Fraction(b, a)) :
s = Fraction(b, a)
print(s)
Fractionを使わなくても分数表示はされませんが,正解の数にはなります
#sample
min = 50/1
for a in range(1, 100) :
for b in range(1, 100) :
if (b/a * 88/15 ) % 1 == 0 and (b/a * 144/25) % 1 == 0 \
and min > b/a :
min = b/a
print(min)
9.375
★論理演算子まとめ
\
| 演算子 | 例 | 意味 | |
|---|---|---|---|
and | A and B | 論理積「AかつB」集合のベン図のAとBの重なり部分 | |
or | A or B | 論理和「AまたはB」ベン図のAとBと重なり部分も全部 | |
not | not A | 否定「Aでない」ベン図のA以外 | \ |
\
Q?
分母が45の分数のうち,0より大きく1より小さい分数について考えます。
次の問いに答えなさい。
(1) 約分できる分数はいくつありますか。
(2) 約分できない分数の和を求めなさい。
\ <英単語>
分母=denominatorデノミネイタ
分子=numeratorニューメレイタ
分数=fractionフラクション
約分=reductionリダクション
和=sumサム
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<算数解法>
(1) 分子が45の約数のときに約分できるから1~44の1以外で45の約数の数を求める
45=3
5の倍数は44÷5=8より8個,15の倍数は44÷15=2…14より2個
以上から14+8-2=20個・・・(答)
\ (2) 約分できない分数の個数は44-20=24個
約分できない一番小さい分数は
\ この計算は1から10までの和を求める方法と同じです。
(1 + 10)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<Python>
(1) 条件にあてはまる分数を数える変数を決めて,はじめは0にしておく
count = 0
\ 分子nに1~44を順番に入れて,nが3または(or)5の倍数の場合はcountする
for n in range(1,45):
if n % 3 == 0 or n % 5 == 0 :
count += 1
\ forの繰り返し文(forループ)が終わったら,最後のcountをprint
print(count, '個')
\ (2) 条件にあてはまる分子の和を数える変数を決めて,はじめは0にしておく
\ 分母は全部45なので,ここでは分子の和を計算し,最後に45で割れば分数の和が求められる
sum = 0
\ 分子nに1~44を順番に入れて,nが3でも5でも割り切れない(余りが0でない)場合は
nをsumに足していく。
ここでは「3で割り切れない」かつ「5で割り切れない」ですのでandを使う
for n in range(1,45):
if n % 3 != 0 and n % 5 != 0 :
sum += n
\ forの繰り返し文(forループ)が終わったら,最後のsumを分母45で割った数をprint
print(sum/45)
\ 小数点をつけたくなかったらint()でくくりましょう
print(int(sum/45))
\
#(1)のSample
count = 0
for n in range(1, 45):
if n % 3 == 0 or n % 5 == 0:
count += 1
print(count, "個")
20 個
#(2)のSample
sum = 0
for n in range(1, 45) :
if n % 3 != 0 and n %5 != 0:
sum += n
print(int(sum/45))
print(sum/45)
12 12.0
#(1)(2)まとめて
count = 0
sum = 0
for n in range(1,45):
if n % 3 == 0 or n % 5 == 0:
count += 1
if n % 3 != 0 and n % 5 != 0:
sum += n
print("(1) ", count, "個")
#print("(2) ", int(sum/45))
print("(2) ", sum/45)
#Fractionを使うSample
from fractions import Fraction
count=0
sum = 0
for n in range(1,45):
if n % 3 == 0 or n % 5 == 0:
count += 1
if n % 3 != 0 and n % 5 != 0:
sum += Fraction(n,45)
print("(1) ", count, "個")
print("(2) ", sum)
この後に九九の計算をしますが,その前に2重のfor文の確認
2重のfor文は,「繰り返し入れ子構造・多重ループ」とか言います
これから3重以上も出てきます
\
2段階のインデントになることに注意して下のコードを実行して結果確認
list1 = [1, 2, 3]
list2 = [4, 5, 6]
for i in list1:
for j in list2:
print(i, j, sep=',')
結果は
1,4
1,5
1,6
2,4
2,5
2,6
3,4
3,5
3,6
となったと思います
はじめの3行は,list1の1に対してlist2の4,5,6
次の3行は,list1の2に対してlist2の4,5,6
最後の3行は,list1の3に対してlist2の4,5,6
の組み合わせ(構造)になっています
\
for文ループでは,1つ目のforの1つの要素に対して2つ目のforの要素全部となる仕組み
であることを覚えておきましょう
Q?
九九を計算する式をすべて表示すると?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
九九は,
1
2
・・・,
9
となっているから,上を参考にこのコードを考えると
\ for x in range(1,10):
for y in range(1,10):
\ とすればいいですね
\ xとyのかけ算の結果をzに入れて
z = x * y
\ 九九の計算の都度表示しますからprint()がforの2重ループの中に入ることに注意です
print(x, '×', y, '=', z)
\
九九の表をつくってみます
\ 上の
print(x, '×', y, '=', z)にかえて
1行目の1end=' '
print(z, end=' ')
\ 1行目が終わったところで改行のためにprint()を入れますが,そのためには2重ループの中ではなく
インデントは1重ループになることに注意です
print()
#sample
for x in range(1, 10):
for y in range(1, 10):
print(x * y, end=" ")
print()
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
これでも表になっているのでOK何ですが,もっと表らしく体裁を整えるために,
2次元リストとDataFrame(データフレーム)というプログラムを使います
DataFrameはpandas(パンダス)というプログラムの集まり(モジュール)の中の1つのプログラムです
\ 2次元リストをつくりましたが,同じ要領で九九の2次元リスト(=表)は下のコードでつくれます
#九九の2次元リスト作成
kuku = []
for a in range(1, 10):
row = []
for b in range(1, 10):
row.append(a * b)
print(row) #入れておくと,リスト作成の途中経過が確認できます
kuku.append(row)
print(kuku)
pandasパンダスはPythonで数や文字などのデータを分析するためのプログラムの集まりで,
データを加工,編集,表示などに利用できます。
\ 将来データ分析や機械学習にすすむときにくわしく学習してください→pandasライブラリ説明
\ ここではpandasの中で,表作成などに利用するDataFrameデータフレーム
というプログラムで九九の表をつくるだけです。
\ DataFrameの使い方の例は下のセルで確認できます。
\ リスト(2次元リスト)に作成したものをDataFrameに入れるときれいな表がつくれます。
リストの要素が多い場合は下のmy_listのようなコードの書き方が多いです。
特に2次元リストの場合は多いです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
pandasからDataFrameをインポート
my_list作成
df変数にDataFrame(my_list)を代入
dfで表示
print(df)とすると,表にならない
#DataFrameの利用の例
from pandas import DataFrame
my_list = [
[1, 100, 0.23, 'January', 'February'], #January=1月, February=2月
[2, 200, 0.59, 'March', 'April'], #March=3月, April=4月
[3, 300, 3, 'May', 'June'], # May=5月, June=6月
[4, 400, 15.12, 'July', 'August'], #July=7月, August=8月
[5, 500, 1.97, 'September', 'October'], #September=9月, October=10月
[6, 600, 2.666, 'November', 'December'] #November=11月, December=12月
]
df = DataFrame(my_list)
df #print(df)とすると表にならないので注意
たて見出しindexと横見出しcolumnsには何も指定しないと数字が入る(0~5,0~4)
下のセルは,indexとcolumnsを入れるためのコード
#indexとcolumnsの追加
from pandas import DataFrame
my_list = [
[1, 100, 0.23, 'January', 'February'],
[2, 200, 0.59, 'March', 'April'],
[3, 300, 3, 'May', 'June'],
[4, 400, 15.12, 'July', 'August'],
[5, 500, 1.97, 'September', 'October'],
[6, 600, 2.666, 'November', 'December']
]
df = DataFrame(my_list, index=['ド','レ','ミ','ファ','ソ','ラ'], columns=['番号','整数','小数','月','Month'])
df
九九の表をつくってDataFrameできれいに表示させます
九九の2次元リスト(kuku)をDataFrameに入れて表示させるだけです
#index,columns指定なし
from pandas import DataFrame
kuku = []
for i in range(1, 10):
row = []
for j in range(1, 10):
row.append(i * j)
kuku.append(row)
#print(kuku) #2次元リスト確認用
kuku_table = DataFrame(kuku)
kuku_table #print(kuku_table)だと表にならないので注意
#index縦見出し,columns横見出しに文字指定
from pandas import DataFrame
kuku = []
for i in range(1, 10):
row = []
for j in range(1, 10):
row.append(i * j)
kuku.append(row)
kuku_table = DataFrame(kuku, index=['一','二','三','四','五','六','七','八','九'], columns = range(1, 10))
kuku_table
#kukuリストを入れたもの
#indexとcolumnsは消した
from pandas import DataFrame
kuku = [
[ 1, 2, 3, 4, 5, 6, 7, 8, 9],
[ 2, 4, 6, 8, 10, 12, 14, 16, 18],
[ 3, 6, 9, 12, 15, 18, 21, 24, 27],
[ 4, 8, 12, 16, 20, 24, 28, 32, 36],
[ 5, 10, 15, 20, 25, 30, 35, 40, 45],
[ 6, 12, 18, 24, 30, 36, 42, 48, 54],
[ 7, 14, 21, 28, 35, 42, 49, 56, 63],
[ 8, 16, 24, 32, 40, 48, 56, 64, 72],
[ 9, 18, 27, 36, 45, 54, 63, 72, 81]
]
kuku_table = DataFrame(kuku)
kuku_table.index = ["","","","","","","","",""]
kuku_table.columns = ["","","","","","","","",""]
print('*九九の表*')
kuku_table
下の式のXにあてはまる数は?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<算数解法>
問題の式は,分配法則の逆の考えで,
カッコの中を計算して,
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<Python>
算数で簡単に解けるのであえてPythonでやるのもと思いますが,練習なので,
分配法則の逆の式まで考えて,Xに1から順に数を入れて計算
Xが見つかったらforループをbreakで中断し,Xをprint
from fractions import Fraction
for X in range(1,100):
if (Fraction(1, 4) - Fraction(1, 7)) * X == 3 :
break
print(X)
Q?
36の約数(divisorディバイザ)を全部求めなさい
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
倍数はmultiple(マルティプル)
最大公約数はthe greatest common divisor(グレイティスト コモン ディヴァイザ)
→GCDと略される
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
36の約数は36以下の数だから
プログラムのイメージとしては
「1から順番に36までの数で36を割っていき,割り切れたら = 余りが0だったらその数をprint」
\ インデントに気をつけて,それをコードにすると
\ for d in range(1, 37):
if 36 % d == 0:
print(d, end=" ")
\ 改行させないときのend = " "を使っています
\
#sample
for d in range(1, 37):
if 36 % d == 0:
print(d, end=" ")
36の約数をリストでprintするのであれば,はじめに約数を入れる空リストをつくり,
約数を見つけたら.append()でリストに追加していく
最後のprintはforループが全部終わってからなのでインデントなしに注意
d_list = []
for d in range(1, 37):
if 36 % d == 0:
d_list.append(d)
print(d_list)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
前にやったリストの内包表記(comprehension・コンプリヘンション)でコードを書き直すと
#リスト内包表記
list1 = [d for d in range(1, 37) if 36 % d == 0]
print(list1, end=" ")
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
約数を大きい順に出力する場合があれば,while文のほうがやりやすいかも
for文でリストにしてsortedで並び替えても同じですが
#whileの利用
n = 30
x = n
while n > 0:
if x % n ==0:
print(n, end=' ')
n -= 1
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
36を変数に入れる式にすると,36を変えるだけでいろいろな約数を求めるコードになります
#sample
num = 36
for d in range(1, num+1):
if num % d == 0:
print(d, end=" ")
Q?
約数を求める関数は?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
上で,約数のリストをつくった作業や,36を変数numに入れる作業が参考になります
\ 関数名をdivisorsとして,引数をnumにして関数を定義します
\ あとは,約数のリストをつくったコードを関数の中身にして,
つくった約数リストd_listを返すretrun
\ 関数を呼びだすのは,関数名に引数を入れて実行▶
#sample
def divisors(num):
d_list = []
for i in range(1, num+1):
if num % i == 0:
d_list.append(i)
return d_list
divisors(36)
Q?
数を入れてもらい,その約数を書き出すプログラムは?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
数を入れてもらうのにinput()を使い,inputした数を変数に入れる
\ 約数をまとめて表示するのでリストを使う
print('約数を書き出します')
number = int(input('整数を入れて下さい:'))
d_list = []
for d in range(1, number+1): #入れた数+1にして,1から入れた数まで調べる
if number % d == 0:
d_list.append(d)
print(number, "の約数は", d_list, "です")
#sample
print('約数を書き出します')
number = int(input('整数を入れて下さい:'))
d_list = []
for d in range(1, number+1):
if number % d == 0:
d_list.append(d)
print(number, "の約数は", d_list, "です")
Q?
7で割って3あまる3けたの整数のうち,小さいほうから数えて50番目の数は?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<答> 444
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
あてはまる数(データ)を数えるcount変数を作り,あてはまる数をxとし,
100から999まで調べます。
\ 7で割ると余りが3になる場合はcountカウントしていき,
カウントが50番目になった場合はforループを中断という
2つの場合分けになる→ifループが2回
\ breakしてループが中断したら,printで出力
\ count = 0
for x in range(100,1000):
if x % 7 == 3:
count += 1
if count == 50:
break
print(x)
Q?
6を加えると11の倍数となり,11を加えると6の倍数になるような整数のうち,
2017に最も近い整数は?
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<算数解法>
「6を加えると11の倍数となり,11を加えると6の倍数になる」ということは,
その数に6 + 11 = 17を加えると,6と11の公倍数になるということ
\ そのような数で一番小さい数は,6と11の最小公倍数 = 66から17を引いた数で,66 - 17 = 49
次にあてはまる数は66
\ 2017に近い数は,(2017 - 17) ÷ 66 = 30…20より見当をつけて,
66
66
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
「2017に最も近い整数」ということは「2017との差が最も小さい」ということになりますが,
その数(データ)は2017より小さい場合もあれば大きい場合も考えられます
\ その場合は,2017との差を求める組み込み関数であるabs()関数を使います
下の組み込み関数の説明を確認
\ 数直線上で,ある数と原点との距離を絶対値といいますが,abs()関数はかっこの中の数の
絶対値を表示します
\ ことばではわかりにくいですが,式で表せば次のことです
絶対値は| |の記号で表し,
|+7| = 7
|-15| = 15
|24 - 87| = 63
という感じです
\ これをabs()関数で表すと,(ここでの=は等号イコールです)
abs(+7) = 7
abs(-15) = 15
abs(24 - 87) = 63
また,
x = -9
abs(x) = 9
\ ( )の中の数(=引数といいます)の絶対値を表示する(=「返す」といいます)関数ということです
組み込み関数なので,print()などと同じくimportしなくても使えます
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
<Python>
条件にあてはまる数xを1500から2500くらいまでで調べる
1900から2100くらいでもよいかも
「6を加えると11の倍数=11で割ったあまりが0」かつ(and)「11を加えると6の倍数」
というif文になります
\ 条件にあてはまる数がいくつも出てくるので,
2017に近い数を残すために前の数と比べなくてはならない。
そこではじめに適当な数をnumberとして設定しておき,
はじめに見つかった数との比較に使います。
\ if文のもう一つの条件として「2017との差の絶対値が小さいほう」をnmberに残します
「if文の3つの条件がYesの場合だけ」ですからandでつなぎます
\ forループが終わったらprintでnumberを出力
number = 1500
for x in range(1500, 2500):
if (x +6) % 11 == 0 and (x + 11) % 6 == 0 and abs(2017 - number) > abs(2017 - x):
number = x
print(number)
#<Code sample>
number = 1500
for x in range(1500, 2500):
if (x + 6) % 11 == 0 and (x + 11) % 6 == 0 and abs(2017 - number) > abs(2017 - x):
number = x
print(number) #このコードを入れておくとnumberに入っている数が変わっていくのがわかる
print(number, "・・・(答)")
#下のセルを実行 !pip install googletrans
pip install googletrans==4.0.0-rc1
Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/
Collecting googletrans==4.0.0-rc1
Downloading googletrans-4.0.0rc1.tar.gz (20 kB)
Collecting httpx==0.13.3
Downloading httpx-0.13.3-py3-none-any.whl (55 kB)
|████████████████████████████████| 55 kB 1.9 MB/s
Collecting hstspreload
Downloading hstspreload-2021.12.1-py3-none-any.whl (1.3 MB)
|████████████████████████████████| 1.3 MB 8.4 MB/s
Collecting httpcore==0.9.*
Downloading httpcore-0.9.1-py3-none-any.whl (42 kB)
|████████████████████████████████| 42 kB 617 kB/s
Requirement already satisfied: chardet==3.* in /usr/local/lib/python3.7/dist-packages (from httpx==0.13.3->googletrans==4.0.0-rc1) (3.0.4)
Collecting sniffio
Downloading sniffio-1.2.0-py3-none-any.whl (10 kB)
Collecting rfc3986<2,>=1.3
Downloading rfc3986-1.5.0-py2.py3-none-any.whl (31 kB)
Requirement already satisfied: idna==2.* in /usr/local/lib/python3.7/dist-packages (from httpx==0.13.3->googletrans==4.0.0-rc1) (2.10)
Requirement already satisfied: certifi in /usr/local/lib/python3.7/dist-packages (from httpx==0.13.3->googletrans==4.0.0-rc1) (2022.5.18.1)
Collecting h2==3.*
Downloading h2-3.2.0-py2.py3-none-any.whl (65 kB)
|████████████████████████████████| 65 kB 3.6 MB/s
Collecting h11<0.10,>=0.8
Downloading h11-0.9.0-py2.py3-none-any.whl (53 kB)
|████████████████████████████████| 53 kB 2.2 MB/s
Collecting hpack<4,>=3.0
Downloading hpack-3.0.0-py2.py3-none-any.whl (38 kB)
Collecting hyperframe<6,>=5.2.0
Downloading hyperframe-5.2.0-py2.py3-none-any.whl (12 kB)
Building wheels for collected packages: googletrans
Building wheel for googletrans (setup.py) ... done
Created wheel for googletrans: filename=googletrans-4.0.0rc1-py3-none-any.whl size=17416 sha256=27740ece85c2a24b5c27e70f63f7425f15707eba3e1e24df68d785ffee1a741e
Stored in directory: /root/.cache/pip/wheels/43/34/00/4fe71786ea6d12314b29037620c36d857e5d104ac2748bf82a
Successfully built googletrans
Installing collected packages: hyperframe, hpack, sniffio, h2, h11, rfc3986, httpcore, hstspreload, httpx, googletrans
Successfully installed googletrans-4.0.0rc1 h11-0.9.0 h2-3.2.0 hpack-3.0.0 hstspreload-2021.12.1 httpcore-0.9.1 httpx-0.13.3 hyperframe-5.2.0 rfc3986-1.5.0 sniffio-1.2.0
from googletrans import Translator
translator = Translator()
trans_en = translator.translate('明後日')
print(trans_en.text)
day after tomorrow
from googletrans import Translator
translator = Translator()
trans_en = translator.translate('コンピュータは小数点の計算が苦手?')
print(trans_en.text)
Are you not good at calculating decimal points for computers?
下のpip install gTTSを▶してからその下のコードを▶して,"Enter your text"が出たら発音を聞きたい英語・英文・英文章などインプット・貼り付けしてEnter
pip install gTTS
Collecting gTTS Downloading https://files.pythonhosted.org/packages/5f/b9/94e59337107be134b21ce395a29fc0715b707b560108d6797de2d93e1178/gTTS-2.2.2-py3-none-any.whl Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from gTTS) (7.1.2) Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from gTTS) (1.15.0) Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from gTTS) (2.23.0) Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (3.0.4) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (2020.12.5) Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (2.10) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (1.24.3) Installing collected packages: gTTS Successfully installed gTTS-2.2.2
from gtts import gTTS
from IPython.display import Audio
text = input("Enter your text: ")
tts = gTTS(text)
tts.save("user_input.mp3")
sound_file = 'user_input.mp3'
Audio(sound_file, autoplay=True)
Enter your text: 1.The United States and the DPRK commit to establish new U.S.-DPRK relations in accordance with the desire of the peoples of the two countries for peace and prosperity. 2.The United States and the DPRK will join their efforts to build a lasting and stable peace regime on the Korean Peninsula.
!pip install gTTS
Collecting gTTS Downloading https://files.pythonhosted.org/packages/5f/b9/94e59337107be134b21ce395a29fc0715b707b560108d6797de2d93e1178/gTTS-2.2.2-py3-none-any.whl Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from gTTS) (7.1.2) Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from gTTS) (1.15.0) Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from gTTS) (2.23.0) Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (3.0.4) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (2020.12.5) Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (2.10) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->gTTS) (1.24.3) Installing collected packages: gTTS Successfully installed gTTS-2.2.2
from gtts import gTTS
from IPython.display import Audio
tts = gTTS('hello joyjit')
tts.save('1.wav')
sound_file = '1.wav'
Audio(sound_file, autoplay=True)
pip install gtts
Requirement already satisfied: gtts in /usr/local/lib/python3.7/dist-packages (2.2.2) Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from gtts) (7.1.2) Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from gtts) (1.15.0) Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from gtts) (2.23.0) Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->gtts) (3.0.4) Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->gtts) (1.24.3) Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->gtts) (2.10) Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->gtts) (2020.12.5)
from gtts import gTTS
tts_ja = gTTS(text='こんにちは', lang='ja', slow=False)
tts_ja.save('hello_ja.mp3')
#tts_ja.save('hello_ja.wave')
tts_en = gTTS(text='hello', lang='en', slow=True)
tts_en.save('hello_en.mp3')
でもちょっとよくわからない。
英語で算数の問題があるサイトなので,興味ある人のご参考
英語で算数ドリル( Japanese Math for Kids2 )
lowercase(小文字)
| alpha | iota | rho | |||||
| beta | kappa | sigma | |||||
| gamma | lambda | tau | |||||
| delta | mu | upsilon | |||||
| epsilon | nu | phi | |||||
| zeta | xi | chi | |||||
| eta | omicron | o | psi | ||||
| theta | pi | omega |
\ Uppercase(大文字)
| alpha | A | iota | I | rho | P | ||
| beta | B | kappa | K | sigma | |||
| gamma | lambda | tau | T | ||||
| delta | mu | M | upsilon | ||||
| epsilon | E | nu | N | phi | |||
| zeta | Z | xi | chi | X | |||
| eta | H | omicron | O | psi | |||
| theta | pi | omega |
Blenderとは->[Wikipedia](https://ja.wikipedia.org/wiki/Blender )
Blender(ブレンダー)は,これだけで3DCG制作ができるいろいろな機能が備わっているソフトです。
オープンソースであるため,誰でも無料で使用することができます。
アニメーション映画、視覚効果、アート、3Dプリントモデルなどの作成に使用されます。
Blenderの開発は,Blender財団という非営利団体が行っています。
MicrosoftやAMD,NVIDIA,Google,Epic Gamesなども開発資金の支援を行っている注目のソフトの一つです。
[Blender Home](https://www.blender.org/)
これは英語ですが,Blenderを日本語化することはできます。
Blenderで遊び始めたばかりなので,まだ紹介できるレベルではないですが,
うまくいけば,Blender with Pythonをお見せする機会があるかも。
後の巻(Vol.4かその後で)で。
ColabのBlenderレンダリングに関しては、Colab [blender-render] (https://colab.research.google.com/github/ynshung/blender-colab/blob/master/blender_render.ipynb)